rainco 7 years ago
parent
commit
a96a7f4904
42 changed files with 603 additions and 350 deletions
  1. 2 1
      applications/document/document-api/src/main/java/com/usoftchina/saas/document/api/WarehouseApi.java
  2. 10 3
      applications/document/document-dto/src/main/java/com.usoftchina.saas.document.dto/ProductDTO.java
  3. 11 0
      applications/document/document-dto/src/main/java/com.usoftchina.saas.document.dto/WarehouseDTO.java
  4. 0 4
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/DocumentApplication.java
  5. 3 5
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/ProductController.java
  6. 1 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/VendorController.java
  7. 13 4
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/WarehouseController.java
  8. 1 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/WarehouseMapper.java
  9. 2 3
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/Impl/WarehouseServiceImpl.java
  10. 1 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/WarehouseService.java
  11. 8 5
      applications/document/document-server/src/main/resources/mapper/WarehouseMapper.xml
  12. 2 10
      applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/PurchaseDTO.java
  13. 2 16
      applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/PurchaseDetailDTO.java
  14. 3 3
      applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/PurchaseFormDTO.java
  15. 2 9
      applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/PurchaseListDTO.java
  16. 29 5
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/controller/PurchaseController.java
  17. 3 1
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/mapper/PurchaseMapper.java
  18. 9 9
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/mapper/PurchasedetailMapper.java
  19. 1 1
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/PurchaseDetail.java
  20. 2 9
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/PurchaseList.java
  21. 1 1
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/Status.java
  22. 19 2
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/PurchaseService.java
  23. 54 16
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java
  24. 3 1
      applications/purchase/purchase-server/src/main/resources/mapper/PurchaseListMapper.xml
  25. 9 0
      applications/purchase/purchase-server/src/main/resources/mapper/PurchaseMapper.xml
  26. 7 7
      applications/purchase/purchase-server/src/main/resources/mapper/PurchasedetailMapper.xml
  27. 35 7
      frontend/saas-web/app/util/FormUtil.js
  28. 11 6
      frontend/saas-web/app/view/core/form/ConDateField.js
  29. 0 32
      frontend/saas-web/app/view/core/form/DateField.js
  30. 55 5
      frontend/saas-web/app/view/core/form/FormPanel.js
  31. 83 81
      frontend/saas-web/app/view/core/form/FormPanelController.js
  32. 1 1
      frontend/saas-web/app/view/core/form/FormPanelModel.js
  33. 83 22
      frontend/saas-web/app/view/core/form/MultiCombo.js
  34. 37 12
      frontend/saas-web/app/view/core/form/field/DetailGridField.js
  35. 1 3
      frontend/saas-web/app/view/main/MainController.js
  36. 6 5
      frontend/saas-web/app/view/purchase/purchase/FormPanel.js
  37. 27 26
      frontend/saas-web/app/view/purchase/purchase/QueryPanel.js
  38. 5 4
      frontend/saas-web/app/view/purchase/purchaseIn/FormPanel.js
  39. 1 0
      frontend/saas-web/app/view/test/order/FormModel.js
  40. 52 28
      frontend/saas-web/app/view/test/order/FormPanel.js
  41. 2 1
      frontend/saas-web/app/view/test/query/QueryPanel.js
  42. 6 0
      frontend/saas-web/ext/build/ext-all-rtl-debug.js

+ 2 - 1
applications/document/document-api/src/main/java/com/usoftchina/saas/document/api/WarehouseApi.java

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.document.api;
 
+import com.usoftchina.saas.base.Result;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 
@@ -9,6 +10,6 @@ import java.util.Map;
 public interface WarehouseApi {
 
     @GetMapping("/api/document/warehouse/post")
-    public String callProcedure(Map<String, Object> param);
+    public Result callProcedure(Map<String, Object> param);
 
 }

+ 10 - 3
applications/document/document-dto/src/main/java/com.usoftchina.saas.document.dto/ProductDTO.java

@@ -9,6 +9,16 @@ public class ProductDTO implements Serializable {
     private String pr_detail;
     private String pr_spec;
     private String pr_orispeccode;
+    private String pr_brand;
+    private String pr_unit;
+
+    public String getPr_unit() {
+        return pr_unit;
+    }
+
+    public void setPr_unit(String pr_unit) {
+        this.pr_unit = pr_unit;
+    }
 
     public long getId() {
         return id;
@@ -18,9 +28,6 @@ public class ProductDTO implements Serializable {
         this.id = id;
     }
 
-    private String pr_brand;
-
-
     public String getPr_code() {
         return pr_code;
     }

+ 11 - 0
applications/document/document-dto/src/main/java/com.usoftchina.saas.document.dto/WarehouseDTO.java

@@ -0,0 +1,11 @@
+package com.usoftchina.saas.document.dto;
+
+import java.io.Serializable;
+
+public class WarehouseDTO implements Serializable {
+
+    private long wh_id;
+    private String wh_code;
+    private String wh_name;
+
+}

+ 0 - 4
applications/document/document-server/src/main/java/com/usoftchina/saas/document/DocumentApplication.java

@@ -1,14 +1,10 @@
 package com.usoftchina.saas.document;
 
-import com.usoftchina.saas.auth.client.EnableAuthClient;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
-import org.springframework.boot.SpringBootConfiguration;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
-import org.springframework.web.servlet.config.annotation.CorsRegistry;
-import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
 
 @SpringBootApplication
 @EnableEurekaClient

+ 3 - 5
applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/ProductController.java

@@ -9,9 +9,7 @@ import com.usoftchina.saas.document.entities.Product;
 import com.usoftchina.saas.document.service.ProductService;
 import com.usoftchina.saas.page.PageRequest;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -37,11 +35,11 @@ public class ProductController {
     @RequestMapping("/updateLatestPurchasePrice")
     public void updateLatestPurchasePrice(@RequestParam(value = "id") Long pu_id) {
         productService.updateLatestPurchasePrice(pu_id);
-    };
+    }
 
     @RequestMapping("/getProductsByPK")
     public Product getProductsByPK(@RequestParam(value = "pr_id") Long id) {
         return productService.getProductsByPK(id);
-    };
+    }
 
 }

+ 1 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/VendorController.java

@@ -6,6 +6,7 @@ import com.usoftchina.saas.document.dto.VendorDTO;
 import com.usoftchina.saas.document.service.VendorService;
 import com.usoftchina.saas.page.PageRequest;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 

+ 13 - 4
applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/WarehouseController.java

@@ -1,7 +1,11 @@
 package com.usoftchina.saas.document.controller;
 
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.document.entities.Warehouse;
 import com.usoftchina.saas.document.service.WarehouseService;
 import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
@@ -9,7 +13,7 @@ import org.springframework.web.bind.annotation.RestController;
 import java.util.Map;
 
 @RestController
-@RequestMapping("/api/document/warehouse")
+@RequestMapping("/warehouse")
 public class WarehouseController {
 
     @Autowired
@@ -20,9 +24,14 @@ public class WarehouseController {
      * @return
      */
     @GetMapping("/post")
-    public String post(Map<String, Object> map){
-        String result = warehouseService.callProcedure(map);
-        return result;
+    public Result post(Map<String, Object> map){
+        warehouseService.callProcedure(map);
+        return Result.success(map.get("result"));
     }
 
+    @PostMapping("/save")
+    public Result saveFormData(@RequestBody Warehouse data){
+        boolean result = warehouseService.save(data);
+        return Result.success(result);
+    }
 }

+ 1 - 1
applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/WarehouseMapper.java

@@ -7,6 +7,6 @@ import java.util.Map;
 
 public interface WarehouseMapper extends CommonBaseMapper<Warehouse> {
 
-    String callProcedure(Map<String, Object> map);
+    void callProcedure(Map<String, Object> map);
 
 }

+ 2 - 3
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/Impl/WarehouseServiceImpl.java

@@ -17,9 +17,8 @@ public class WarehouseServiceImpl extends CommonBaseServiceImpl<WarehouseMapper,
     private WarehouseMapper warehouseMapper;
 
     @Override
-    public String callProcedure(Map<String, Object> map){
-        String result = warehouseMapper.callProcedure(map);
-        return result;
+    public void callProcedure(Map<String, Object> map){
+        warehouseMapper.callProcedure(map);
     }
 
 }

+ 1 - 1
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/WarehouseService.java

@@ -9,6 +9,6 @@ import java.util.Map;
 
 public interface WarehouseService extends CommonBaseService<WarehouseMapper, Warehouse> {
 
-    String callProcedure(Map<String, Object> map);
+    void callProcedure(Map<String, Object> map);
 
 }

+ 8 - 5
applications/document/document-server/src/main/resources/mapper/WarehouseMapper.xml

@@ -20,12 +20,15 @@
         <result column="wh_text4" property="wh_text4" jdbcType="VARCHAR" />
         <result column="wh_text5" property="wh_text5" jdbcType="VARCHAR" />
     </resultMap>
-    <select id="callProcedure" parameterMap="testParamMap" statementType="CALLABLE">
-        call sp_test(?, ?)
+    <select id="callProcedure" parameterMap="paramMap" statementType="CALLABLE">
+        CALL SP_COMMITPRODINOUT(?, ?, ?, ?, ?)
     </select>
-    <parameterMap id="testParamMap" type="java.util.Map">
-        <parameter property="inParam" jdbcType="VARCHAR" mode="IN" />
-        <parameter property="outParam" jdbcType="VARCHAR" mode="OUT" />
+    <parameterMap id="paramMap" type="java.util.Map">
+        <parameter property="inoutNo" jdbcType="VARCHAR" mode="IN" />
+        <parameter property="class" jdbcType="VARCHAR" mode="IN" />
+        <parameter property="commitid" jdbcType="INTEGER" mode="IN" />
+        <parameter property="companyid" jdbcType="INTEGER" mode="IN" />
+        <parameter property="result" jdbcType="VARCHAR" mode="OUT" />
     </parameterMap>
     
 </mapper>

+ 2 - 10
applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/PurchaseDTO.java

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.purchase.dto;
 
+import com.usoftchina.saas.base.dto.CommonBaseDTO;
 import io.swagger.annotations.ApiModel;
 import lombok.Data;
 
@@ -12,16 +13,7 @@ import java.util.Date;
  */
 @Data
 @ApiModel(value = "Purchase", description = "采购订单")
-public class PurchaseDTO implements Serializable{
-    protected Long id;
-    /**
-     * company id
-     */
-    protected long companyId;
-    protected Date createTime;
-    protected long creatorId;
-    protected Date updateTime;
-    protected long updaterId;
+public class PurchaseDTO extends CommonBaseDTO implements Serializable{
 
     private String pu_code;
 

+ 2 - 16
applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/PurchaseItemDTO.java → applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/PurchaseDetailDTO.java

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.purchase.dto;
 
+import com.usoftchina.saas.base.dto.CommonBaseDTO;
 import com.usoftchina.saas.document.entities.Product;
 import lombok.Data;
 
@@ -11,22 +12,7 @@ import java.util.Date;
  * @date 2018/10/9
  */
 @Data
-public class PurchaseItemDTO implements Serializable{
-    protected Long id;
-
-    /**
-     * company id
-
-     */
-    protected long companyId;
-
-    protected Date createTime;
-
-    protected long creatorId;
-
-    protected Date updateTime;
-
-    protected long updaterId;
+public class PurchaseDetailDTO extends CommonBaseDTO implements Serializable{
 
     private  Long pd_puid;
 

+ 3 - 3
applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/PurchaseFormDTO.java

@@ -11,7 +11,7 @@ import java.util.List;
  */
 public class PurchaseFormDTO implements Serializable{
     private PurchaseDTO main;
-    private List<PurchaseItemDTO> items;
+    private List<PurchaseDetailDTO> items;
 
     public PurchaseDTO getMain() {
         return main;
@@ -21,11 +21,11 @@ public class PurchaseFormDTO implements Serializable{
         this.main = main;
     }
 
-    public List<PurchaseItemDTO> getItems() {
+    public List<PurchaseDetailDTO> getItems() {
         return items;
     }
 
-    public void setItems(List<PurchaseItemDTO> items) {
+    public void setItems(List<PurchaseDetailDTO> items) {
         this.items = items;
     }
 

+ 2 - 9
applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/PurchaseListDTO.java

@@ -1,5 +1,6 @@
 package com.usoftchina.saas.purchase.dto;
 
+import com.usoftchina.saas.base.dto.CommonBaseDTO;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -12,16 +13,8 @@ import java.util.Date;
  * @date 2018/10/9
  */
 @Data
-public class PurchaseListDTO implements Serializable {
+public class PurchaseListDTO extends CommonBaseDTO implements Serializable {
     //主表信息
-    protected long companyId;
-
-    protected Date createTime;
-
-    protected Date updateTime;
-
-    protected long updaterId;
-
     private  Integer pu_id;
 
     private String pu_code;

+ 29 - 5
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/controller/PurchaseController.java

@@ -80,9 +80,9 @@ public class PurchaseController {
      * @param id
      * @return
      */
-    @GetMapping("/deleteItem/{id}")
-    public Result deleteItem(@PathVariable("id") Long id) {
-        purchaseService.deleteItem(id);
+    @GetMapping("/deleteDetail/{id}")
+    public Result deleteDetail(@PathVariable("id") Long id) {
+        purchaseService.deleteDetail(id);
         return Result.success();
     }
 
@@ -94,8 +94,20 @@ public class PurchaseController {
      */
     @PostMapping("/audit")
     public Result audit(@RequestBody PurchaseFormDTO formData) {
-        Long id = purchaseService.audit(formData);
-        return Result.success(id);
+        DocSavedDTO audit = purchaseService.audit(formData);
+        return Result.success(audit);
+    }
+
+    /**
+     * 采购订单审批
+     *
+     * @param id
+     * @return
+     */
+    @GetMapping("/unAudit/{id}")
+    public Result unAudit(@PathVariable("id") Long id) {
+        purchaseService.unAudit(id);
+        return Result.success();
     }
 
     /**
@@ -122,4 +134,16 @@ public class PurchaseController {
         return Result.success();
     }
 
+    /**
+     * 采购订单批量反审核
+     *
+     * @param baseDTOs
+     * @return
+     */
+    @PostMapping("/batchUnAudit")
+    public Result batchUnAudit(@RequestBody BatchDealBaseDTO baseDTOs) {
+        purchaseService.batchUnAudit(baseDTOs);
+        return Result.success();
+    }
+
 }

+ 3 - 1
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/mapper/PurchaseMapper.java

@@ -16,5 +16,7 @@ public interface PurchaseMapper extends CommonBaseMapper<Purchase>{
 
     String validateAudit(List<DocBaseDTO> list);
 
-    List<Purchase> selectByTest(String con);
+    String validateUnAudit(Long id);
+
+    String validateBatchUnAudit(List<DocBaseDTO> baseDTOs);
 }

+ 9 - 9
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/mapper/PurchasedetailMapper.java

@@ -2,28 +2,28 @@ package com.usoftchina.saas.purchase.mapper;
 
 import com.usoftchina.saas.base.mapper.CommonBaseMapper;
 import com.usoftchina.saas.purchase.po.Purchase;
-import com.usoftchina.saas.purchase.po.PurchaseItem;
+import com.usoftchina.saas.purchase.po.PurchaseDetail;
 import java.util.List;
 
 
 public interface PurchasedetailMapper extends CommonBaseMapper<Purchase> {
     int deleteByPrimaryKey(Integer pdId);
 
-    int insert(PurchaseItem record);
+    int insert(PurchaseDetail record);
 
-    int insertSelective(PurchaseItem record);
+    int insertSelective(PurchaseDetail record);
 
-    PurchaseItem selectByPrimaryKey(Integer pdId);
+    PurchaseDetail selectByPrimaryKey(Integer pdId);
 
-    int updateByPrimaryKeySelective(PurchaseItem record);
+    int updateByPrimaryKeySelective(PurchaseDetail record);
 
-    int updateByPrimaryKey(PurchaseItem record);
+    int updateByPrimaryKey(PurchaseDetail record);
 
-    void batchInsert(List<PurchaseItem> list);
+    void batchInsert(List<PurchaseDetail> list);
 
-    void batchUpdate(List<PurchaseItem> list);
+    void batchUpdate(List<PurchaseDetail> list);
 
     void deleteByForeignKey(Long fk_id);
 
-    List<PurchaseItem> selectByFK(Long fk_i);
+    List<PurchaseDetail> selectByFK(Long fk_i);
 }

+ 1 - 1
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/PurchaseItem.java → applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/PurchaseDetail.java

@@ -8,7 +8,7 @@ import lombok.Data;
 import java.io.Serializable;
 
 @Data
-public class PurchaseItem extends CommonBaseEntity implements Serializable {
+public class PurchaseDetail extends CommonBaseEntity implements Serializable {
 
     private  Long pd_puid;
 

+ 2 - 9
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/PurchaseList.java

@@ -1,6 +1,7 @@
 package com.usoftchina.saas.purchase.po;
 
 
+import com.usoftchina.saas.base.entity.CommonBaseEntity;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -11,17 +12,9 @@ import java.util.Date;
  * @create: 2018-10-10 16:42
  **/
 @Data
-public class PurchaseList implements Serializable {
+public class PurchaseList extends CommonBaseEntity implements Serializable {
 
     //主表信息
-    protected long companyId;
-
-    protected Date createTime;
-
-    protected Date updateTime;
-
-    protected long updaterId;
-
     private  Integer pu_id;
 
     private String pu_code;

+ 1 - 1
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/Status.java

@@ -4,7 +4,7 @@ public enum Status {
     /**
      * 在录入
      */
-    ENTERING("在录入"),
+    UNAUDITED("未审核"),
 
     /**
      * 已审核

+ 19 - 2
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/PurchaseService.java

@@ -63,7 +63,7 @@ public interface PurchaseService extends CommonBaseService<PurchaseMapper, Purch
      * @param id
      * @return
      */
-    int deleteItem(Long id);
+    int deleteDetail(Long id);
 
     /**
      * 删除明细
@@ -71,7 +71,7 @@ public interface PurchaseService extends CommonBaseService<PurchaseMapper, Purch
      * @param formData
      * @return
      */
-    Long audit(PurchaseFormDTO formData);
+    DocSavedDTO audit(PurchaseFormDTO formData);
 
     /**
     * @Description 批量审核
@@ -90,5 +90,22 @@ public interface PurchaseService extends CommonBaseService<PurchaseMapper, Purch
     * @Date: 2018/10/15
     */
     void batchDelete(BatchDealBaseDTO baseDTOs);
+    /**
+    * @Description
+     * 反审核
+    * @Param: [id]
+    * @return: com.usoftchina.saas.common.dto.DocSavedDTO
+    * @Author: guq
+    * @Date: 2018/10/17
+    */
+    void unAudit(Long id);
 
+    /** 
+    * @Description
+    * @Param: [baseDTOs] 
+    * @return: void 
+    * @Author: guq
+    * @Date: 2018/10/17 
+    */
+    void batchUnAudit(BatchDealBaseDTO baseDTOs);
 }

+ 54 - 16
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java

@@ -19,7 +19,6 @@ import com.usoftchina.saas.purchase.service.PurchaseService;
 import com.usoftchina.saas.utils.BeanMapper;
 
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
@@ -68,8 +67,8 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         //将purchase实体对象转化成传输对象
         PurchaseDTO main = BeanMapper.map(purchase, PurchaseDTO.class);
         //查询从表
-        List<PurchaseItem> purchaseItems = purchasedetailMapper.selectByFK(id);
-        List<PurchaseItemDTO> items = BeanMapper.mapList(purchaseItems, PurchaseItemDTO.class);
+        List<PurchaseDetail> purchaseDetails = purchasedetailMapper.selectByFK(id);
+        List<PurchaseDetailDTO> items = BeanMapper.mapList(purchaseDetails, PurchaseDetailDTO.class);
         purchaseFormDTO.setMain(main);
         purchaseFormDTO.setItems(items);
         return  purchaseFormDTO;
@@ -83,17 +82,17 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
 
         //获取主表信息
         PurchaseDTO main = formdata.getMain();
-        List<PurchaseItemDTO> items = formdata.getItems();
+        List<PurchaseDetailDTO> items = formdata.getItems();
         //插入从表数据
-        List<PurchaseItem> insertDetails = new ArrayList<>();
+        List<PurchaseDetail> insertDetails = new ArrayList<>();
         //更新从表数据
-        List<PurchaseItem> updateDetails = new ArrayList<>();
+        List<PurchaseDetail> updateDetails = new ArrayList<>();
         DocSavedDTO saveDTO = new DocSavedDTO();
         Long pu_id = main.getId();
         String pu_code = main.getPu_code();
         Purchase purchase = BeanMapper.map(main, Purchase.class);
 
-        //编号获取
+        //编号获取 到时候确定处理
         if (StringUtils.isEmpty(pu_code)) {
             pu_code = "PU" + Math.random() * 1000;
             purchase.setPu_code(pu_code);
@@ -102,10 +101,10 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         //判断更新与保存动作
         if (!StringUtils.isEmpty(pu_id)) {
             //更新主表
-            purchaseMapper.updateByPrimaryKey(purchase);
+            purchaseMapper.updateByPrimaryKeySelective(purchase);
             //添加从表传输对象
-            for (PurchaseItemDTO item : items) {
-                PurchaseItem detail = BeanMapper.map(item, PurchaseItem.class);
+            for (PurchaseDetailDTO item : items) {
+                PurchaseDetail detail = BeanMapper.map(item, PurchaseDetail.class);
                 detail.setPd_puid(pu_id);
                 detail.setPd_code(pu_code);
                 if (!StringUtils.isEmpty(detail.getId())) {
@@ -130,8 +129,8 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         purchaseMapper.insertSelective(purchase);
         pu_id = purchase.getId();
         //添加从表传输对象
-        for (PurchaseItemDTO item : items) {
-            PurchaseItem detail = BeanMapper.map(item, PurchaseItem.class);
+        for (PurchaseDetailDTO item : items) {
+            PurchaseDetail detail = BeanMapper.map(item, PurchaseDetail.class);
             detail.setPd_puid(pu_id);
             detail.setPd_code(pu_code);
             insertDetails.add(detail);
@@ -150,13 +149,14 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
     }
 
     @Override
-    public int deleteItem(Long id) {
+    public int deleteDetail(Long id) {
         return purchasedetailMapper.deleteByPrimaryKey(id);
     }
 
     @Override
-    public Long audit(PurchaseFormDTO formData) {
+    public DocSavedDTO audit(PurchaseFormDTO formData) {
         Long id = null;
+        DocSavedDTO savedDTO = new DocSavedDTO();
         if (null != formData) {
             id = formData.getMain().getId();
             if (StringUtils.isEmpty(id)) {
@@ -165,7 +165,8 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
             }
             singleAudit(id);
         }
-        return id;
+        savedDTO.setId(id);
+        return savedDTO;
     }
 
     @Override
@@ -192,6 +193,32 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         }
     }
 
+    @Override
+    public void unAudit(Long id) {
+        if (null == id) {
+            return;
+        }
+        String code = purchaseMapper.validateUnAudit(id);
+        if (null != code) {
+            throw new BizException(500, "单据:" + code + " 未审核,无法反审核");
+        }
+        singleUnAudit(id);
+    }
+
+    @Override
+    public void batchUnAudit(BatchDealBaseDTO baseDTOs) {
+        if (null == baseDTOs || null == baseDTOs.getBaseDTOs() ||
+                baseDTOs.getBaseDTOs().size() == 0)
+            return;
+        String msg = purchaseMapper.validateBatchUnAudit(baseDTOs.getBaseDTOs());
+        if (null != msg) {
+            throw new BizException(500, "存在未审核单据,单据编号:" + msg);
+        }
+        for (DocBaseDTO base : baseDTOs.getBaseDTOs()) {
+            singleUnAudit(base.getId());
+        }
+    }
+
     private void singleAudit(Long id) {
         Purchase purchase = new Purchase();
         //生成更新对象
@@ -205,6 +232,17 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         productApi.updateLatestPurchasePrice(id);
     }
 
+    private void singleUnAudit(Long id) {
+        Purchase purchase = new Purchase();
+        //生成更新对象
+        purchase.setId(id);
+        purchase.setPu_status(Status.UNAUDITED.getDisplay());
+        purchase.setPu_statuscode(Status.UNAUDITED.name());
+        purchase.setUpdateTime(new Date());
+        //更新存在字段
+        purchaseMapper.updateByPrimaryKeySelective(purchase);
+    }
+
     private void singleDelete(Long id) {
         if (null != id) {
             //从表删除
@@ -216,7 +254,7 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
 
     private List<PurchaseList> getListByMode(PurchaseReqDTO req) {
         List<PurchaseList> list = null;
-        if (null == req || StringUtils.isEmpty(req.getMode()) || "Main".equals(req.getMode())) {
+        if (null == req || StringUtils.isEmpty(req.getMode()) || "MAIN".equals(req.getMode())) {
             list = purchaseListMapper.selectPurchaseBycondition(req);
         } else {
             list = purchaseListMapper.selectPurchaseListByCondition(req);

+ 3 - 1
applications/purchase/purchase-server/src/main/resources/mapper/PurchaseListMapper.xml

@@ -70,6 +70,7 @@
             <if test="keyword != null">
                 AND ${keyword}
             </if>
+            order by pu_id,pd_detno desc
         </where>
     </select>
 
@@ -89,6 +90,7 @@
                 AND ${keyword}
             </if>
         </where>
+        order by pu_id desc
     </select>
     <insert id="batchInsert" parameterType="java.util.List" >
         insert into purchasedetail ( PD_PUID, PD_CODE,
@@ -115,7 +117,7 @@
             )
         </foreach>
     </insert>
-    <update id="batchUpdate" parameterType="com.usoftchina.saas.purchase.po.PurchaseItem" >
+    <update id="batchUpdate" parameterType="com.usoftchina.saas.purchase.po.PurchaseDetail" >
         <foreach collection="list" item="item" index="index" open="" close="" separator=";">
             update purchasedetail <set>
             PD_PUID = #{item.pdPuid},

+ 9 - 0
applications/purchase/purchase-server/src/main/resources/mapper/PurchaseMapper.xml

@@ -397,6 +397,15 @@
       #{item.id}
     </foreach>
   </select>
+  <select id="validateBatchUnAudit" parameterType="com.usoftchina.saas.common.dto.DocBaseDTO" resultType="java.lang.String">
+    select GROUP_CONCAT(pu_code) from purchase where pu_statuscode='UNAUDITED' and pu_id in
+    <foreach collection="list" item="item" open="(" close=")" separator=",">
+      #{item.id}
+    </foreach>
+  </select>
+  <select id="validateUnAudit" parameterType="long" resultType="java.lang.String">
+    select pu_code from purchase where pu_id = #{pu_id} and IFNULL(pu_statuscode,'UNAUDITED')='UNAUDITED'
+  </select>
   <select id="selectByTest" resultMap="BaseResultMap" parameterType="string" >
     select * from purchase <where>
     <if test="_parameter != null">

+ 7 - 7
applications/purchase/purchase-server/src/main/resources/mapper/PurchasedetailMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.usoftchina.saas.purchase.mapper.PurchasedetailMapper" >
-  <resultMap id="BaseResultMap" type="com.usoftchina.saas.purchase.po.PurchaseItem" >
+  <resultMap id="BaseResultMap" type="com.usoftchina.saas.purchase.po.PurchaseDetail" >
     <id column="PD_ID" property="id" jdbcType="INTEGER" />
     <result column="PD_PUID" property="pd_puid" jdbcType="INTEGER" />
     <result column="PD_CODE" property="pd_code" jdbcType="VARCHAR" />
@@ -74,7 +74,7 @@
     delete from purchasedetail
     where PD_ID = #{id}
   </delete>
-  <insert id="insert" parameterType="com.usoftchina.saas.purchase.po.PurchaseItem" >
+  <insert id="insert" parameterType="com.usoftchina.saas.purchase.po.PurchaseDetail" >
     insert into purchasedetail (PD_PUID, PD_CODE,
     PD_DETNO, PD_PRODID, PD_PRODCODE,
     PD_UNIT, PD_QTY, PD_PRICE,
@@ -94,7 +94,7 @@
     #{pdText3,jdbcType=VARCHAR}, #{pdText4,jdbcType=VARCHAR}, #{pdText5,jdbcType=VARCHAR},
     #{pdYqty,jdbcType=DOUBLE})
   </insert>
-  <insert id="insertSelective" parameterType="com.usoftchina.saas.purchase.po.PurchaseItem" >
+  <insert id="insertSelective" parameterType="com.usoftchina.saas.purchase.po.PurchaseDetail" >
     insert into purchasedetail
     <trim prefix="(" suffix=")" suffixOverrides="," >
       <if test="pdPuid != null" >
@@ -245,7 +245,7 @@
       </if>
     </trim>
   </insert>
-  <update id="updateByPrimaryKeySelective" parameterType="com.usoftchina.saas.purchase.po.PurchaseItem" >
+  <update id="updateByPrimaryKeySelective" parameterType="com.usoftchina.saas.purchase.po.PurchaseDetail" >
     update purchasedetail
     <set >
       <if test="pdPuid != null" >
@@ -323,7 +323,7 @@
     </set>
     where PD_ID = #{id,jdbcType=INTEGER}
   </update>
-  <update id="updateByPrimaryKey" parameterType="com.usoftchina.saas.purchase.po.PurchaseItem" >
+  <update id="updateByPrimaryKey" parameterType="com.usoftchina.saas.purchase.po.PurchaseDetail" >
     update purchasedetail
     set PD_PUID = #{pdPuid,jdbcType=INTEGER},
     PD_CODE = #{pdCode,jdbcType=VARCHAR},
@@ -376,7 +376,7 @@
       )
     </foreach>
   </insert>
-  <update id="batchUpdate" parameterType="com.usoftchina.saas.purchase.po.PurchaseItem" >
+  <update id="batchUpdate" parameterType="com.usoftchina.saas.purchase.po.PurchaseDetail" >
     <foreach collection="list" item="item" index="index" open="" close="" separator=";">
       update purchasedetail <set>
       PD_PUID = #{item.pd_puid},
@@ -412,6 +412,6 @@
   </delete>
   <select id="selectByFK" parameterType="long" resultMap="BaseResultMap">
     select * from purchasedetail a left join product b on pr_id=pd_prodid and a.companyid = b.companyid
-      where pd_puid=#{pu_id}
+      where pd_puid=#{pu_id} order by pd_detno desc
   </select>
 </mapper>

+ 35 - 7
frontend/saas-web/app/util/FormUtil.js

@@ -16,9 +16,12 @@ Ext.define('saas.util.FormUtil', {
         var me = this,
         viewName = form.viewName,
         defaultItems = form.defaultItems,
+        brr = [],
         formModel = form.getViewModel(),
         url = me.baseUrl.replace(me.urlRe, '$1' + viewName);
         
+        brr = brr.concat(form.defaultItems);
+
         this.BaseUtil.request({url, async: false})
         .then(function(response) {
             var res = Ext.decode(response.responseText);
@@ -33,8 +36,30 @@ Ext.define('saas.util.FormUtil', {
                         Ext.apply(item, cusItem);
                     });
                     Ext.Array.each(items, function(item) {
+                        var bind = item.bind,
+                        bindName = bind,
+                        defaultValue = item.defaultValue;
+                        
+                        if(bindName && !Ext.isString(bindName)) {
+                            bindName = bindName.value;
+                        }
+                        if(bindName) {
+                            bindName = bindName.replace(/[{|}]/g, '');
+                        }
+
+                        // 设置初始值
+                        if(defaultValue) {
+                            formModel.set(bindName, defaultValue);
+                        }
+
+                        // 设置必填
+                        if(item.allowBlank==false){
+                            // TODO 需要判断类型
+                            item.beforeLabelTextTpl = "<font color=\"red\" style=\"position:relative; top:2px;right:2px; font-weight: bolder;\">*</font>";
+                        }
+
+                        // 如果是从表为其绑定store
                         if(item.xtype == 'detailGridField') {
-                            var storeName = item.name || item.xtype + Ext.id();
                             item.bind = {
                                 store: '{_detailStore}'
                             };           
@@ -74,22 +99,25 @@ Ext.define('saas.util.FormUtil', {
 
     loadData: function(form) {
         var me = this;
-        
         if(form.initId && form.initId!=0) {
-            var url = form._dataModelUrl + form.initId,async=false;
+            var url = form._readUrl + form.initId,async=false;
             me.BaseUtil.request({url,async })
             .then(function(response) {
                 var res = Ext.decode(response.responseText);
                 if(res.success) {
-                    var viewModel = form.getViewModel();
-                    viewModel.setData(res.data.main);
-                    var detailStore = viewModel.get('_detailStore');
-                    detailStore.loadData(res.data.items);
+                    form.setFormData({
+                        main: res.data.main,
+                        detail: res.data.items
+                    });
                 }
             })
             .catch(function(response) {
                 console.error(response);
             });
+        }else{
+            var viewModel = form.getViewModel();
+            var detailStore = viewModel.get('_detailStore');
+            detailStore.loadData([{},{},{},{},{},{},{},{},{},{}]);
         }
     }
 });

+ 11 - 6
frontend/saas-web/app/view/core/form/ConDateField.js

@@ -77,7 +77,7 @@ Ext.define('saas.view.core.form.ConDateField', {
                     }else {
                         me.value=null;
                     }
-                    me.setValue(v, from, to);
+                    me.setBindValue(v, from, to);
                 }
             }
         });
@@ -107,7 +107,7 @@ Ext.define('saas.view.core.form.ConDateField', {
                     }else {
                         me.value=null;
                     }
-                    me.setValue(v, from, to);
+                    me.setBindValue(v, from, to);
                 }
             }
         });
@@ -189,7 +189,7 @@ Ext.define('saas.view.core.form.ConDateField', {
             from.setEditable(false);
             to.setEditable(false);
         }
-        me.setValue(v, minDate, maxDate);
+        me.setBindValue(v, minDate, maxDate);
     },
     setInitValue: function(v) {
         if (v) {
@@ -197,12 +197,17 @@ Ext.define('saas.view.core.form.ConDateField', {
             this.setDateFieldValue(v);
         }
     },
-    setValue: function(v, from, to){
-        this.value = {type: v,
+    setBindValue: function(v, from, to){
+        this.value = {
+            type: v,
             from: from,
-            to: to};
+            to: to
+        };
         this.publishState('value', this.value);
     },
+    setValue: function(v) {
+        this.value = v;
+    },
     getValue: function(){
         return this.value;
     },

+ 0 - 32
frontend/saas-web/app/view/core/form/DateField.js

@@ -1,32 +0,0 @@
-Ext.define('saas.view.core.form.DateField', {
-    extend: 'Ext.form.field.Date',
-    alias: 'widget.datetimefield',
-
-    setValue: function(v) {
-        var me = this,
-            utilDate = Ext.Date,
-            rawDate;
-        me.lastValue = me.rawDateText;
-        me.lastDate = me.rawDate;
-        if (Ext.isDate(v)) {
-            rawDate = me.rawDate = v;
-            me.rawDateText = me.formatDate(v);
-        } else {
-            rawDate = me.rawDate = me.rawToValue(v);
-            me.rawDateText = me.formatDate(v);
-            if (rawDate === v) {
-                if(v&&v.indexOf('.')>-1&&v.indexOf('T')>-1){
-                     v = v.substring(0,v.indexOf('T'));
-                    rawDate = null;
-                }else{
-                    rawDate = me.rawDate = null;
-                    me.rawDateText = '';
-                }     
-            }
-        }
-        if (rawDate && !utilDate.formatContainsHourInfo(me.format)) {
-            me.rawDate = utilDate.clearTime(rawDate, true);
-        }
-        me.callParent(arguments);
-    }
-});

+ 55 - 5
frontend/saas-web/app/view/core/form/FormPanel.js

@@ -36,6 +36,7 @@ Ext.define('saas.view.core.form.FormPanel', {
     initComponent: function() {
 
         var me = this;
+        me.initViewModel();
         me.FormUtil.setItems(me);
 
         Ext.apply(me, {
@@ -56,21 +57,54 @@ Ext.define('saas.view.core.form.FormPanel', {
                 }, {
                     xtype: 'button',
                     text: '保存',
-                    handler: 'save'
+                    handler: 'save',
+                    formBind: true
                 }, {
                     xtype: 'button',
                     text: '删除',
                     handler: 'delete'
                 }, {
                     xtype: 'button',
-                    text: '审核',
-                    handler: "audit"
+                    bind: {
+                        text: '{auditBtnText}'
+                    },
+                    handler: "auditBtnClick",
+                    
                 }]))
             }]
         });
         me.callParent(arguments);
     },
 
+    /**
+     * 一些初始化viewModel的方法
+     */
+    initViewModel: function() {
+        var me = this,
+        statusField = me._statusField,
+        statusCodeField = me._statusCodeField,
+        viewModel = me.getViewModel();
+        
+        var o = {};
+        o[statusField] = {
+            bind: '{' + statusCodeField + '}',
+            get: function(value) {
+                return value == 'AUDITED' ? '已审核' : '未审核'
+            }
+        };
+        o['auditBtnText'] = {
+            bind: '{' + statusCodeField + '}',
+            get: function(value) {
+                return value == 'AUDITED' ? '反审核' : '审核'
+            }
+        };
+        viewModel.setFormulas(o);
+
+        viewModel.set('createTime', new Date());
+        viewModel.set('updateTime', new Date());
+        statusCodeField ? viewModel.set(statusCodeField, "UNAUDITED") : viewModel.set('auditBtnText', "审核");
+    },
+
     addItems: function(items) {
         var me = this;
         me.setBindFields(items);
@@ -80,7 +114,7 @@ Ext.define('saas.view.core.form.FormPanel', {
     /**
      * 获取form数据
      */
-    getFormData: function() {
+    getFormData: function(ignore) {
         var me = this,
         viewModel = me.getViewModel(),
         allData = viewModel.getData(),
@@ -93,9 +127,14 @@ Ext.define('saas.view.core.form.FormPanel', {
         for(k in allData) {
             var d = allData[k];
             // 主表数据
-            if(bindFields.indexOf(k) != -1) {
+            if(ignore) {
                 formData.main[k] = d;
+            }else {
+                if(bindFields.indexOf(k) != -1) {
+                    formData.main[k] = d;
+                }
             }
+
             // 从表数据
             if(k == '_detailStore') {
                 storeData = d.getData().items;
@@ -106,6 +145,17 @@ Ext.define('saas.view.core.form.FormPanel', {
         return formData;
     },
 
+    setFormData: function(formData) {
+        var me = this,
+        main = formData.main,
+        detail = formData.detail,
+        viewModel = me.getViewModel(),
+        detailStore = viewModel.get('_detailStore');
+
+        viewModel.setData(main);
+        detailStore.loadData(detail);
+    },
+
     /**
      * 设置需要绑定的字段
      */

+ 83 - 81
frontend/saas-web/app/view/core/form/FormPanelController.js

@@ -5,17 +5,26 @@ Ext.define('saas.view.core.form.FormPanelController', {
     BaseUtil: Ext.create('saas.util.BaseUtil'),
     FormUtil: Ext.create('saas.util.FormUtil'),
 
-    add: function(btn){
-        var form = btn.ownerCt.ownerCt;
+    auditBtnClick: function() {
+        var me = this,
+        form = me.getView(),
+        statusCodeField = form._statusCodeField,
+        viewModel = me.getViewModel(),
+        status = viewModel.get(statusCodeField);
+
+        status == 'AUDITED' ? me.unAudit() : me.audit();
+    },
+
+    add: function(){
+        var form = this.getView();
         var mainTab = Ext.getCmp('main-tab-panel');
-        var title = '新增' + btn.ownerCt.ownerCt._title;
+        var title = '新增' + form._title;
         var id = form.xtype + '_add';
         existingItem = mainTab.down('[id=' + id + ']');
-
         lastView = mainTab.getActiveTab();
-
         if (!existingItem) {
             var form = {
+                initId:0,
                 id,
                 title,
                 xtype:form.xtype
@@ -26,34 +35,33 @@ Ext.define('saas.view.core.form.FormPanelController', {
         }
     },
     
-    delete: function(btn){
-        var form = btn.ownerCt.ownerCt;
+    delete: function(){
+        var me = this;
+        var form = this.getView();
         var id = form.getForm().findField(form._idField);
         if(id&&id.value!=0){
-            Ext.Ajax.request({
+            me.BaseUtil.request({
                 url: form._deleteUrl+id.value,
-                params: '',
-                headers: {
-                    'Access-Control-Allow-Origin': '*',
-                    "Content-Type": 'application/json;charset=UTF-8' 
-                },
-                success: function (response, opts) {
+                method: 'GET',
+            })
+            .then(function(res) {
+                var localJson = new Ext.decode(res.responseText);
+                if(localJson.success){
                     var mainTab = Ext.getCmp('main-tab-panel');
                     mainTab.getActiveTab().close();
                     //解析参数
                     Ext.Msg.alert('提示','删除成功');
-                },
-                failure: function (response, opts) {
-                    //失败
-                    Ext.Msg.alert('提示','删除失败');
                 }
+            })
+            .catch(function() {
+                Ext.Msg.alert('提示','删除失败');
             });
         }
     },
 
-    save:function(btn){
+    save:function(){
         var me = this;
-        var form = btn.ownerCt.ownerCt;
+        var form = this.getView();
         if(form.getForm().wasDirty==false){
             Ext.Msg.alert('提示','未修改数据,请修改后保存');
             return false;
@@ -63,96 +71,90 @@ Ext.define('saas.view.core.form.FormPanelController', {
             return false;
         }
         //form里面数据
-        var formData = form.viewModel.data;
-        var gridData = [];
-        var newGridData = [];
-        if(formData.detailGridField){
-            gridData = formData.detailGridField;
-        }
-
-        var grid = form.query('detailGridField')[0];
-        var items = grid.store.data.items;
-        if(items.length>0){
-            Ext.each(items, function(rec){
-                if(rec.dirty==true){
-                    Ext.each(gridData, function(data,index){
-                        data[form._detnoColumn] = index + 1;
-                        if(rec.id == data.id){
-                            newGridData.push(data);
-                            return false;
-                        }else if ((typeof data.id) != 'number'&&data.id.indexOf('extMode')>-1){
-                            data.id = '';
-                            newGridData.push(data);
-                            return false;
-                        }
-                    });
+        var formData = form.getFormData();
+        var gridData = formData.detail?formData.detail:[];
+        var dirtyGridData = [];
+        if(gridData.length>0){
+            Ext.each(gridData, function(item,index){
+                if(item.dirty){
+                    if((typeof item.data.id) != "number" && item.data.id.indexOf('extMode')>-1){
+                        item.data.id = '';
+                    }
+                    dirtyGridData.push(item.data)
                 }
             });
-        }   
+        }  
+        debugger 
         var params = {
-            main:formData,
-            items:newGridData
+            main:formData.main,
+            items:dirtyGridData
         }
         me.BaseUtil.request({
             url: form._saveUrl,
             params: JSON.stringify(params),
             method: 'POST',
         })
-        .then(function() {
-            Ext.Msg.alert('提示','保存成功');
+        .then(function(res) {
+            var localJson = new Ext.decode(res.responseText);
+            if(localJson.success){
+                Ext.Msg.alert('提示','保存成功');
+                form.initId = localJson.data.id;
+                form.FormUtil.loadData(form);
+            }
         })
         .catch(function() {
             Ext.Msg.alert('提示','保存失败');
         });
     },
-    audit: function(btn){
-        var form = btn.ownerCt.ownerCt;
+
+    audit: function(){
+        var me = this;
+        var form = this.getView();
+        if(form.getForm().wasDirty==false){
+            Ext.Msg.alert('提示','未修改数据,请修改后保存');
+            return false;
+        }
         if(form.getForm().wasValid==false){
             Ext.Msg.alert('提示','表单校验有误,请检查');
             return false;
         }
         //form里面数据
-        var formData = form.viewModel.data;
-        var gridData = [];
-        var newGridData = [];
-        if(formData.detailGridField){
-            gridData = formData.detailGridField;
-        }
-        var grid = form.query('detailGridField')[0];
-        var updRecords = grid.store.getUpdatedRecords();
-        if(updRecords.length>0){
-            Ext.each(updRecords, function(rec){
-                Ext.each(gridData, function(data,index){
-                    if(data.id==rec.id){
-                        if(data.id.indexOf('extMode')>-1){
-                            data.id = '';
-                            data[form._detnoColumn] = index + 1;
-                        }
-                        newGridData.push(data);
+        var formData = form.getFormData();
+        var gridData = formData.detail?formData.detail:[];
+        var dirtyGridData = [];
+        if(gridData.length>0){
+            Ext.each(gridData, function(item,index){
+                if(item.dirty){
+                    if((typeof item.data.id) != "number" && item.data.id.indexOf('extMode')>-1){
+                        item.data.id = '';
                     }
-                });
+                    dirtyGridData.push(item.data)
+                }
             });
         }   
         var params = {
-            main:formData,
-            items:newGridData
+            main:formData.main,
+            items:dirtyGridData
         }
-        Ext.Ajax.request({
+        me.BaseUtil.request({
             url: form._auditUrl,
             params: JSON.stringify(params),
             method: 'POST',
-            headers: {
-                'Access-Control-Allow-Origin': '*',
-                "Content-Type": 'application/json;charset=UTF-8' 
-            },
-            success: function (response, opts) {
-                //解析参数
+        })
+        .then(function(res) {
+            var localJson = new Ext.decode(res.responseText);
+            if(localJson.success){
                 Ext.Msg.alert('提示','审核成功');
-            },
-            failure: function (response, opts) {
-                //失败
-                Ext.Msg.alert('提示','审核失败');
+                form.initId = localJson.data.id;
+                form.FormUtil.loadData(form);
             }
+        })
+        .catch(function() {
+            Ext.Msg.alert('提示','审核失败');
         });
     },
+    unAudit: function() {
+        console.log('反审核');
+        return;
+    }
 });

+ 1 - 1
frontend/saas-web/app/view/core/form/FormPanelModel.js

@@ -5,5 +5,5 @@ Ext.define('saas.view.core.form.FormPanelModel', {
     data: {
         bindFields: [], // 请求绑定字段,绑定到formfield并且未设置ignore为true
         _detailStore: null, // 从表store
-    }
+    },
 });

+ 83 - 22
frontend/saas-web/app/view/core/form/MultiCombo.js

@@ -5,9 +5,8 @@ Ext.define('saas.view.core.form.MultiCombo', {
     extend: 'Ext.form.field.Trigger',
     alias: 'widget.multicombo',
     editable : false,
-    displayField:'display',
-    valueField:'value',
     matchFieldWidth: true,
+    value: [],
     cachedConfig: {
         menuAlign: 'tl-bl?',
         destroyMenu: true
@@ -16,7 +15,23 @@ Ext.define('saas.view.core.form.MultiCombo', {
         var me = this;
         me.callParent(arguments);
     },
-    onTriggerClick:function(f){
+    listeners:{
+        afterrender:function(f){
+            this.mon(f.el,{
+                mouseover: this.onMouseOver,
+                mouseleave:this.onMouseLeave,
+                scope:this
+            });
+        }
+
+    },
+    onMouseOver:function(){
+       this.showMenu();
+    },
+    onMouseLeave:function(a,b,c){
+        this.hideMenu(a.parentEvent?a:b);//el光标离开第二个参数为Event对象
+    },
+    onTriggerClick:function(){
         this.showMenu();
     },
     getMenu: function() {
@@ -26,10 +41,12 @@ Ext.define('saas.view.core.form.MultiCombo', {
 
             me.menu = Ext.create('Ext.menu.Menu',{
                 hideOnParentHide: false,
-                items: me.getMenuItems()
-                //listners
+                items: me.getMenuItems(),
+                listeners:{
+                    mouseleave:me.onMouseLeave,
+                    scope:me
+                }
             });
-            me.fireEvent('menucreate', me, me.menu);
         }
         return me.menu;
     },
@@ -37,14 +54,18 @@ Ext.define('saas.view.core.form.MultiCombo', {
         var me = this,
             i = 0,
             item,
-            items = me.datas;
-        itemsLn = me.datas.length,
-            menuItems = [];
+            items = me.datas,
+            itemsLn = me.datas.length,
+            menuItems = [],
+            value = me.value;
         for (; i < itemsLn; i++) {
             item = items[i];
+            var checked = !!value.find(function(v) {
+                return v.value = iem[0];
+            });
             menuItem = new Ext.menu.CheckItem({
                 text: item[1],
-                checked: item.checked,
+                checked: checked,
                 checkValue:item[0],
                 hideOnClick: false,
                 checkHandler: this.onCheckChange,
@@ -56,34 +77,61 @@ Ext.define('saas.view.core.form.MultiCombo', {
     },
     onCheckChange:function(checkItem, checked){
         var items=this.menu.items.items,
-            rawV,v;
+            checkedItems = [];
         Ext.Array.each(items,function(item){
             if(item.checked){
-                rawV=rawV?rawV+','+item.text:item.text;
-                v=v?v+","+"'"+item.checkValue+"'":"'"+item.checkValue+"'";
+                checkedItems.push({
+                    text: item.text,
+                    value: item.checkValue
+                });
             }
         });
+        this.setValue(checkedItems);
+    },
+
+    setValue: function(items) {
+        var me = this, rawV = '',
+        datas = me.datas,
+        menu = me.menu;
+        if(!Ext.isArray(items)) {
+            items = [items]
+        }
+        items.map(function(item, index) {
+            if(Ext.isString(item)) {
+                var data = datas.find(function(d) {
+                    return d[0] == item;
+                });
+                items[index] = {
+                    text: data[1],
+                    value: data[0]
+                }
+            }
+        })
+        rawV = items.map(function(item) {
+            return item.text
+        }).join(',');
         this.setRawValue(rawV);
-        this.value=v;
+        this.value = items;
+        if(menu) {
+            Ext.Array.each(menu.items.items, function(item) {
+                item.setChecked(!!items.find(function(i) {
+                    return i.value == item.checkValue;
+                }));
+            });
+        }
+        this.publishState('value', items);
     },
 
     showMenu: function (e, menu) {
-        var isPointerEvent = !e || e.pointerType;
-
         menu = menu || this.getMenu();
         /**
          * menu上边框样式待处理
          * */
         if (menu) {
             if (menu.isVisible()) {
-                // Click/tap toggles the menu visibility.
-                if (isPointerEvent) {
-                    menu.hide();
-                } else {
                     menu.focus();
-                }
             } else {
-                menu.autoFocus = !isPointerEvent;
+                menu.autoFocus = true;
                 if(this.matchFieldWidth){
                     menu.setWidth(this.bodyEl.getWidth());
                 }
@@ -96,5 +144,18 @@ Ext.define('saas.view.core.form.MultiCombo', {
                 }
             }
         }
+    },
+    hideMenu: function(b) {
+        if (this.hasVisibleMenu()) {
+            var target=b.parentEvent.relatedTarget;
+            if(!((target.className && target.className.indexOf('x-menu')!=-1) || (target.name && target.name.indexOf(this.name)!=-1))){
+                this.menu.hide();
+            }
+        }
+        return this;
+    },
+    hasVisibleMenu: function() {
+        var menu = this.menu;
+        return menu && menu.rendered && menu.isVisible();
     }
 });

+ 37 - 12
frontend/saas-web/app/view/core/form/field/DetailGridField.js

@@ -25,6 +25,16 @@ Ext.define('saas.view.core.form.field.DetailGridField', {
     showIndex: true,
     configUrl: '',
 
+    features: [{
+        ftype : 'groupingsummary',
+        groupHeaderTpl : '{name}',
+        hideGroupedHeader : false,
+        enableGroupingMenu : false
+    }, {
+        ftype: 'summary',
+        dock: 'bottom'
+    }],
+
     initComponent: function() {
         var me = this;
         Ext.apply(me, {
@@ -65,45 +75,60 @@ Ext.define('saas.view.core.form.field.DetailGridField', {
     },
 
     listeners: {
-        afterrender:function(grid){
-            var count = grid.store.getCount();
-            if(count==0){
-                //grid.add10EmptyRow();
-            }
-        },
         itemClick: function(tableView, record, item, index, e, eOpts) {
             var grid = tableView.up('grid'),
                 store = grid.store,
                 count = store.getCount();
 
             if(index == count - 1) {
-                //grid.add10EmptyRow();
+                grid.add10EmptyRow();
             }
         }
     },
 
     add10EmptyRow: function() {
         var me = this,
-            store = me.getStore(),
-            selectedRecord = me.selModel.lastSelected,
-            datas = [];
+        form = me.ownerCt,
+        detnoColumn = form._detnoColumn,
+        store = me.getStore(),
+        selectedRecord = me.selModel.lastSelected,
+        datas = [];
 
+        //当前行后序号全部加1
+        var detno = selectedRecord.data[form._detnoColumn];
         Ext.Array.each(new Array(10), function() {
-            datas.push({});
+            detno += 1;
+            var data = {};
+            data[detnoColumn] = detno;
+            datas.push(data);
         })
         store.insert(store.indexOf(selectedRecord) + 1, datas);
     },
 
     addDetail: function() {
         var me = this,
+            form = me.ownerCt,
+            detnoColumn = form._detnoColumn,
             store = me.getStore(),
             selectedRecord = me.selModel.lastSelected;
 
-        store.insert(store.indexOf(selectedRecord) + 1, {});
+        //当前行后序号全部加1
+        var detno = selectedRecord.data[form._detnoColumn];
+        var store = me.store;
+        store.each(function(item){
+            d = item.data[detnoColumn];
+            if(Number(d) > detno) {
+                item.set(detnoColumn, Number(d) + 1);
+            }
+        });
+        var data = {};
+        data[detnoColumn] = detno + 1;
+        store.insert(store.indexOf(selectedRecord) + 1, data);
     },
 
     deleteDetail: function() {
         var me = this,
+            form = me.ownerCt;
             store = me.getStore(),
             selectedRecord = me.selModel.lastSelected;
 

+ 1 - 3
frontend/saas-web/app/view/main/MainController.js

@@ -21,9 +21,7 @@ Ext.define('saas.view.main.MainController', {
             mainTab = refs.mainTabPanel,
             // existingItem = mainTab.child(type),
             newView,
-            id = 'maintab-' + nodeData.id 
-
-,
+            id = 'maintab-' + nodeData.id,
             title = nodeData.text;
             existingItem = mainTab.down('[id=' + id + ']'),
             lastView = mainTab.getActiveTab();

+ 6 - 5
frontend/saas-web/app/view/purchase/purchase/FormPanel.js

@@ -7,7 +7,8 @@ Ext.define('saas.view.purchase.purchase.FormPanel', {
     
     _title:'采购单',
     _codeField: 'pu_ode',
-    _statusField: 'pu_statuscode',
+    _statusField: 'pu_status',
+    _statusCodeField: 'pu_statuscode',
     _idField: 'id',
     _detnoColumn:  'pd_detno',
     _dataModelUrl:'http://192.168.253.58:8800/purchase/read/',
@@ -191,7 +192,7 @@ Ext.define('saas.view.purchase.purchase.FormPanel', {
                 xtype:'datecolumn',
                 format : "Y-m-d H:i:s", 
                 editor : {
-                    xtype : "datetimefield",
+                    xtype : "datefield",
                     editable : true, 
                     format : "Y-m-d H:i:s", 
                     hideTrigger : false
@@ -206,7 +207,7 @@ Ext.define('saas.view.purchase.purchase.FormPanel', {
         ]
     }, {
         format : "Y-m-d", 
-        xtype : "datetimefield", 
+        xtype : "datefield", 
         name : "createTime", 
         bind : "{createTime}", 
         fieldLabel : "创建时间", 
@@ -223,8 +224,8 @@ Ext.define('saas.view.purchase.purchase.FormPanel', {
         xtype : "textfield", 
         readOnly : true, 
         editable : false, 
-        name : "puStatus", 
-        bind : "{puStatus}", 
+        name : "pu_status", 
+        bind : "{pu_status}", 
         fieldLabel : "单据状态", 
         allowBlank : true, 
         columnWidth : 0.25

+ 27 - 26
frontend/saas-web/app/view/purchase/purchase/QueryPanel.js

@@ -2,11 +2,12 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
     extend: 'saas.view.core.query.QueryPanel',
     xtype: 'purchase-purchase-querypanel',
 
+    controller: 'purchase-purchase-querypanel',
     viewModel: 'purchase-purchase-querypanel',
     viewName: 'purchase-purchase-formpanel',
-    _baseVastUrl:'http://192.168.253.58:8800/purchase/',
-    _idField:'pu_id',
-    _codeField:'pu_code',
+    _baseVastUrl: 'http://192.168.253.58:8800/purchase/',
+    _idField: 'pu_id',
+    _codeField: 'pu_code',
     queryFormItems: [{
         xtype: 'hidden',
         name: 'pu_id',
@@ -49,7 +50,7 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
         bind: '{pd_prodcode}',
         fieldLabel: '物料编号',
         fieldMode: 'DETAIL',
-        queryType:'VAG',
+        queryType: 'VAG',
         allowBlank: true,
         columnWidth: 0.25
     }, {
@@ -113,11 +114,11 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
         columnWidth: 1
     }],
     queryGridConfig: {
-        _idField:'pu_id',
-        _codeField:'pu_code',
-        _title:'采购单',
-        _addXtype:'test-order-formpanel',
-        _baseVastUrl:'http://192.168.253.58:8800/purchase/',
+        _idField: 'pu_id',
+        _codeField: 'pu_code',
+        _title: '采购单',
+        _addXtype: 'test-order-formpanel',
+        _baseVastUrl: 'http://192.168.253.58:8800/purchase/',
         _baseColumn: [{
             text: '序号',
             width: 80,
@@ -138,21 +139,21 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
         }, {
             text: '下单日期',
             dataIndex: 'pu_indate',
-            xtype:'datecolumn',
+            xtype: 'datecolumn',
             width: 200
-        },{
+        }, {
             text: '供应商名称',
             dataIndex: 'pu_vendname',
             width: 120
-        },{
+        }, {
             text: '含税金额',
             dataIndex: 'pu_taxtotal',
-            xtype:'numbercolumn',
+            xtype: 'numbercolumn',
             width: 120
-        },{
+        }, {
             text: '金额',
             dataIndex: 'pu_total',
-            xtype:'numbercolumn',
+            xtype: 'numbercolumn',
             width: 120,
             flex: 1
         }],
@@ -176,35 +177,35 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
         }, {
             text: '下单日期',
             dataIndex: 'pu_indate',
-            xtype:'datecolumn',
+            xtype: 'datecolumn',
             width: 200
-        },{
+        }, {
             text: '供应商名称',
             dataIndex: 'pu_vendname',
             width: 120
-        },{
+        }, {
             text: '采购序号',
             dataIndex: 'pd_detno',
-            xtype:'numbercolumn',
+            xtype: 'numbercolumn',
             width: 120
-        },{
+        }, {
             text: '物料编号',
             dataIndex: 'pd_prodcode',
             width: 120
-        },{
+        }, {
             text: '数量',
             dataIndex: 'pd_qty',
-            xtype:'numbercolumn',
+            xtype: 'numbercolumn',
             width: 120
-        },{
+        }, {
             text: '单价',
             dataIndex: 'pd_price',
-            xtype:'numbercolumn',
+            xtype: 'numbercolumn',
             width: 120
-        },{
+        }, {
             text: '已转数',
             dataIndex: 'pd_ytqy',
-            xtype:'numbercolumn',
+            xtype: 'numbercolumn',
             width: 120,
             flex: 1
         }]

+ 5 - 4
frontend/saas-web/app/view/purchase/purchaseIn/FormPanel.js

@@ -7,7 +7,8 @@ Ext.define('saas.view.purchase.purchaseIn.FormPanel', {
     
     _title:'采购验收单',
     _codeField: 'pi_inoutno',
-    _statusField: 'pi_statuscode',
+    _statusField: 'pu_status',
+    _statusCodeField: 'pu_statuscode',
     _idField: 'id',
     _detnoColumn:  'pd_pdno',
     _dataModelUrl:'http://192.168.253.58:8800/purchase/read/',
@@ -239,7 +240,7 @@ Ext.define('saas.view.purchase.purchaseIn.FormPanel', {
         ]
     }, {
         format : "Y-m-d", 
-        xtype : "datetimefield", 
+        xtype : "datefield", 
         name : "createTime", 
         bind : "{createTime}", 
         fieldLabel : "创建时间", 
@@ -256,8 +257,8 @@ Ext.define('saas.view.purchase.purchaseIn.FormPanel', {
         xtype : "textfield", 
         readOnly : true, 
         editable : false, 
-        name : "puStatus", 
-        bind : "{puStatus}", 
+        name : "pu_status", 
+        bind : "{pu_status}", 
         fieldLabel : "单据状态", 
         allowBlank : true, 
         columnWidth : 0.25

+ 1 - 0
frontend/saas-web/app/view/test/order/FormModel.js

@@ -2,4 +2,5 @@ Ext.define('saas.view.test.order.FormModel', {
     extend: 'saas.view.core.form.FormPanelModel',
     alias: 'viewmodel.test-order-formmodel',
 
+    
 });

+ 52 - 28
frontend/saas-web/app/view/test/order/FormPanel.js

@@ -39,7 +39,7 @@ Ext.define('saas.view.test.order.FormPanel', {
         xtype : "textfield", 
         name : "pu_code", 
         bind : "{pu_code}", 
-        fieldLabel : "采购单号", 
+        fieldLabel : "采购单号",
         allowBlank : true, 
         columnWidth : 0.25
     }, {
@@ -47,8 +47,9 @@ Ext.define('saas.view.test.order.FormPanel', {
         name : "pu_date", 
         bind : "{pu_date}", 
         fieldLabel : "采购日期", 
-        allowBlank : true, 
-        columnWidth : 0.25
+        allowBlank : false, 
+        columnWidth : 0.25,
+        format:'Y-m-d'
     }, {
         xtype : "hidden", 
         name : "pu_vendid", 
@@ -126,9 +127,15 @@ Ext.define('saas.view.test.order.FormPanel', {
         columns : [
             {
                 text : "序号", 
-                dataIndex : "pdDetno", 
-                width : 80.0, 
-                xtype : "rownumberer"
+                dataIndex : "pd_detno", 
+                width : 100, 
+                xtype : "numbercolumn",
+                align : 'center',
+                format:'0',
+                summaryType: 'count',
+                summaryRenderer: function(value, summaryData, dataIndex) {
+                    return Ext.String.format('合计: {0}条', value);
+                },
             }, 
             {
                 editor : {
@@ -154,7 +161,7 @@ Ext.define('saas.view.test.order.FormPanel', {
                 text : "单位", 
                 editor : {
                     xtype : "textfield"
-                }, 
+                },
                 dataIndex : "pd_unit", 
                 width : 120.0, 
                 xtype : "", 
@@ -163,45 +170,52 @@ Ext.define('saas.view.test.order.FormPanel', {
             {
                 text : "数量", 
                 dataIndex : "pd_yqty", 
+                editor : {
+                    xtype : "numberfield"
+                },
                 width : 120.0, 
-                xtype : "", 
-                items : null
+                xtype : "numbercolumn", 
+                format:'0',
+                items : null,
+                summaryType: 'sum'
             }, 
             {
                 text : "单价", 
+                editor : {
+                    xtype : "numberfield"
+                },
+                format:'0,000.00',
                 dataIndex : "pd_price", 
                 width : 120.0, 
-                xtype : "numbercolumn", 
-                items : null
+                xtype : "numbercolumn",
+                items : null,
+                summaryType: 'sum'
             }, 
             {
                 text : "总额", 
                 dataIndex : "pd_total", 
                 width : 120.0, 
-                xtype : "numbercolumn"
+                xtype : "numbercolumn",
+                summaryType: 'sum'
             }, 
             {
                 text : "税额", 
                 dataIndex : "pd_taxtotal", 
                 flex : 1.0, 
-                xtype : "numbercolumn"
-            }, 
-            {
-                text : "id", 
-                dataIndex : "id", 
-                flex : 1.0, 
-                xtype : "numbercolumn"
+                xtype : "numbercolumn",
+                summaryType: 'sum'
             }
         ]
     }, {
         format : "Y-m-d", 
-        xtype : "datetimefield", 
+        xtype : "datefield", 
         name : "createTime", 
         bind : "{createTime}", 
         fieldLabel : "创建时间", 
         allowBlank : true, 
         columnWidth : 0.25
     }, {
+        format : "Y-m-d",
         xtype : "datefield", 
         name : "updateTime", 
         bind : "{updateTime}", 
@@ -212,19 +226,29 @@ Ext.define('saas.view.test.order.FormPanel', {
         xtype : "textfield", 
         readOnly : true, 
         editable : false, 
-        name : "puStatus", 
-        bind : "{puStatus}", 
+        name : "pu_status", 
+        bind : "{pu_status}", 
         fieldLabel : "单据状态", 
         allowBlank : true, 
         columnWidth : 0.25
-    }, {
-        xtype : "hidden", 
-        readOnly : true, 
-        editable : false, 
+    }, 
+    // {
+    //     xtype : "hidden", 
+    //     readOnly : true, 
+    //     editable : false, 
+    //     name : "pu_statuscode", 
+    //     bind : "{pu_statuscode}", 
+    //     fieldLabel : "单据状态码", 
+    //     allowBlank : true, 
+    //     columnWidth : 0.0
+    // },
+    {
+        xtype : "textfield", 
         name : "pu_statuscode", 
         bind : "{pu_statuscode}", 
-        fieldLabel : "单据状态码", 
+        fieldLabel : "忽略字段", 
+        ignore:true,
         allowBlank : true, 
-        columnWidth : 0.0
+        columnWidth : 0.25
     }]
 });

+ 2 - 1
frontend/saas-web/app/view/test/query/QueryPanel.js

@@ -2,8 +2,9 @@ Ext.define('saas.view.test.query.QueryPanel', {
     extend: 'saas.view.core.query.QueryPanel',
     xtype: 'test-query-querypanel',
 
-    // controller: 'test-query-formcontroller',
+    controller: 'test-query-querypanel',
     viewModel: 'test-query-querypanel',
+    
     viewName: 'test-query-formpanel',
     _baseVastUrl:'http://192.168.253.58:8800/purchase/',
     _idField:'pu_id',

+ 6 - 0
frontend/saas-web/ext/build/ext-all-rtl-debug.js

@@ -206312,6 +206312,12 @@ Ext.define('Ext.form.field.Date', {
             rawDate;
         me.lastValue = me.rawDateText;
         me.lastDate = me.rawDate;
+        //解析后台日期格式为 Y-m-d
+        if(v&&(typeof v) == "string"&&v.indexOf('.')==19&&v.indexOf('T')==10){
+            var d = new Date(v);
+            var times=d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate(); //+ ' ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds(); 
+            v = times;
+        }
         if (Ext.isDate(v)) {
             rawDate = me.rawDate = v;
             me.rawDateText = me.formatDate(v);