Browse Source

Merge branch 'dev' of ssh://10.10.100.21/source/saas-platform into dev

jinsy 7 years ago
parent
commit
8c638d8b1b
66 changed files with 2456 additions and 213 deletions
  1. 1 0
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/exception/BizExceptionCode.java
  2. 101 0
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/po/DataImport.java
  3. 110 0
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/po/DataImportDetail.java
  4. 80 0
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/po/DataTemplet.java
  5. 72 0
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/po/TempletSet.java
  6. 6 0
      applications/commons/commons-server/pom.xml
  7. 81 0
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/ExcelController.java
  8. 10 0
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/DataImportDetailMapper.java
  9. 17 0
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/DataImportMapper.java
  10. 9 0
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/DataTempletMapper.java
  11. 14 0
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/ExcelService.java
  12. 484 0
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/ExcelServiceImpl.java
  13. 83 0
      applications/commons/commons-server/src/main/resources/mapper/DataImportDetailMapper.xml
  14. 83 0
      applications/commons/commons-server/src/main/resources/mapper/DataImportMapper.xml
  15. 17 0
      applications/commons/commons-server/src/main/resources/mapper/DataTempletMapper.xml
  16. 7 2
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/ProductController.java
  17. 22 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/DataImportMapper.java
  18. 2 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/ProductMapper.java
  19. 2 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/WarehouseMapper.java
  20. 4 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/ProductService.java
  21. 95 3
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/ProductServiceImpl.java
  22. 105 0
      applications/document/document-server/src/main/resources/mapper/DataImportMapper.xml
  23. 4 0
      applications/document/document-server/src/main/resources/mapper/ProductMapper.xml
  24. 3 0
      applications/document/document-server/src/main/resources/mapper/WarehouseMapper.xml
  25. 4 0
      applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/PurchaseDTO.java
  26. 5 2
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/controller/ProdInOutController.java
  27. 1 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/mapper/ProdInOutListMapper.java
  28. 175 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/ProdHomePageList.java
  29. 4 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/Purchase.java
  30. 4 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/PurchaseList.java
  31. 2 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/ProdInOutService.java
  32. 19 12
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/ProdInOutServiceImpl.java
  33. 2 0
      applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/PurchaseServiceImpl.java
  34. 117 4
      applications/purchase/purchase-server/src/main/resources/mapper/ProdInOutListMapper.xml
  35. 2 0
      applications/purchase/purchase-server/src/main/resources/mapper/PurchaseListMapper.xml
  36. 3 0
      applications/sale/sale-dto/src/main/java/com/usoftchina/saas/sale/dto/PurchaseDTO.java
  37. 4 0
      applications/sale/sale-dto/src/main/java/com/usoftchina/saas/sale/dto/PurchaseListDTO.java
  38. 7 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/controller/ProdInOutController.java
  39. 1 1
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/ProdInOutListMapper.java
  40. 175 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/po/ProdHomePageList.java
  41. 2 3
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/ProdInOutService.java
  42. 15 0
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/ProdInOutServiceImpl.java
  43. 3 5
      applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java
  44. 117 0
      applications/sale/sale-server/src/main/resources/mapper/ProdInOutListMapper.xml
  45. 12 0
      applications/sale/sale-server/src/main/resources/mapper/SaleMapper.xml
  46. 12 1
      base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyRspDTO.java
  47. 2 1
      base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountCenterServiceImpl.java
  48. 1 1
      base-servers/account/account-server/src/main/resources/mapper/AccountCompanyMapper.xml
  49. 1 11
      base-servers/gateway-server/src/main/java/com/usoftchina/saas/gateway/config/AuthFilter.java
  50. 3 3
      frontend/saas-web/app/Application.scss
  51. 95 6
      frontend/saas-web/app/view/core/base/ImportWindow.js
  52. 1 2
      frontend/saas-web/app/view/core/dbfind/types/WarehouseDbfindTrigger.js
  53. 10 61
      frontend/saas-web/app/view/core/form/field/DetailGridField.js
  54. 2 1
      frontend/saas-web/app/view/document/bom/FormPanel.js
  55. 1 1
      frontend/saas-web/app/view/document/kind/ChildForm.js
  56. 1 1
      frontend/saas-web/app/view/home/infoCardList/UnauditSaleOut.js
  57. 0 1
      frontend/saas-web/app/view/main/Main.js
  58. 5 2
      frontend/saas-web/app/view/main/Navigation.js
  59. 19 1
      frontend/saas-web/app/view/main/Navigation.scss
  60. 2 2
      frontend/saas-web/app/view/money/report/CustomerCheck.js
  61. 3 4
      frontend/saas-web/app/view/purchase/purchase/QueryPanel.js
  62. 6 6
      frontend/saas-web/app/view/purchase/report/Purchase.js
  63. 1 1
      frontend/saas-web/app/view/stock/report/ProdinoutCount.js
  64. 20 16
      frontend/saas-web/app/view/sys/power/TreePanel.js
  65. 0 58
      frontend/saas-web/ext/packages/ux/src/feature/MySummary.js
  66. 185 0
      frontend/saas-web/ext/packages/ux/src/plugin/MenuClipboard.js

+ 1 - 0
applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/exception/BizExceptionCode.java

@@ -35,6 +35,7 @@ public enum BizExceptionCode implements BaseExceptionCode {
     BIZ_RELUPDATE_CODEANDNAME(79311,"存在关联单据,不允许更新编号,名称"),
     BIZ_RELUPDATE_AMOUNT(79312,"存在关联单据,不允许更新期初应收,期初预收,期初日期"),
     NO_OPRATIONDATA(79400,"无可操作单据"),
+    NULL_DATA(23232,"无数据"),
 
     BOM_SAVE(79401, "产品编号+版本号已存在"),
     REPEAT_NAME(79501, "名称重复"),

+ 101 - 0
applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/po/DataImport.java

@@ -0,0 +1,101 @@
+package com.usoftchina.saas.commons.po;
+
+import java.util.Date;
+
+/**
+ * @author: guq
+ * @create: 2018-11-29 15:15
+ **/
+public class DataImport {
+    public Long getCompanyid() {
+        return companyid;
+    }
+
+    public void setCompanyid(Long companyid) {
+        this.companyid = companyid;
+    }
+
+    private Integer di_id;
+
+    private String di_caller;
+
+    private Long companyid;
+
+    private Date di_date;
+
+    private Integer di_count;
+
+    private String di_result;
+
+    private Integer di_success;
+
+    private String di_man;
+
+    private Integer di_toformal;
+
+    public Integer getDi_id() {
+        return di_id;
+    }
+
+    public void setDi_id(Integer di_id) {
+        this.di_id = di_id;
+    }
+
+    public String getDi_caller() {
+        return di_caller;
+    }
+
+    public void setDi_caller(String di_caller) {
+        this.di_caller = di_caller == null ? null : di_caller.trim();
+    }
+
+
+
+    public Date getDi_date() {
+        return di_date;
+    }
+
+    public void setDi_date(Date di_date) {
+        this.di_date = di_date;
+    }
+
+    public Integer getDi_count() {
+        return di_count;
+    }
+
+    public void setDi_count(Integer di_count) {
+        this.di_count = di_count;
+    }
+
+    public String getDi_result() {
+        return di_result;
+    }
+
+    public void setDi_result(String di_result) {
+        this.di_result = di_result == null ? null : di_result.trim();
+    }
+
+    public Integer getDi_success() {
+        return di_success;
+    }
+
+    public void setDi_success(Integer di_success) {
+        this.di_success = di_success;
+    }
+
+    public String getDi_man() {
+        return di_man;
+    }
+
+    public void setDi_man(String di_man) {
+        this.di_man = di_man == null ? null : di_man.trim();
+    }
+
+    public Integer getDi_toformal() {
+        return di_toformal;
+    }
+
+    public void setDi_toformal(Integer di_toformal) {
+        this.di_toformal = di_toformal;
+    }
+}

+ 110 - 0
applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/po/DataImportDetail.java

@@ -0,0 +1,110 @@
+package com.usoftchina.saas.commons.po;
+
+/**
+ * @author: guq
+ * @create: 2018-11-29 15:16
+ **/
+public class DataImportDetail {
+
+    private Integer dd_id;
+
+    private String dd_maindata;
+
+    public Long getCompanyid() {
+        return companyid;
+    }
+
+    public void setCompanyid(Long companyid) {
+        this.companyid = companyid;
+    }
+
+    private Integer dd_detno;
+
+    private Integer dd_diid;
+
+    private Integer dd_checked;
+
+    private Integer dd_success;
+
+    private Integer dd_toformal;
+
+    private Long companyid;
+
+    private String dd_detaildata;
+
+    private String dd_codevalue;
+
+    public Integer getDd_id() {
+        return dd_id;
+    }
+
+    public void setDd_id(Integer dd_id) {
+        this.dd_id = dd_id;
+    }
+
+    public String getDd_maindata() {
+        return dd_maindata;
+    }
+
+    public void setDd_maindata(String dd_maindata) {
+        this.dd_maindata = dd_maindata == null ? null : dd_maindata.trim();
+    }
+
+    public Integer getDd_detno() {
+        return dd_detno;
+    }
+
+    public void setDd_detno(Integer dd_detno) {
+        this.dd_detno = dd_detno;
+    }
+
+    public Integer getDd_diid() {
+        return dd_diid;
+    }
+
+    public void setDd_diid(Integer dd_diid) {
+        this.dd_diid = dd_diid;
+    }
+
+    public Integer getDd_checked() {
+        return dd_checked;
+    }
+
+    public void setDd_checked(Integer dd_checked) {
+        this.dd_checked = dd_checked;
+    }
+
+    public Integer getDd_success() {
+        return dd_success;
+    }
+
+    public void setDd_success(Integer dd_success) {
+        this.dd_success = dd_success;
+    }
+
+    public Integer getDd_toformal() {
+        return dd_toformal;
+    }
+
+    public void setDd_toformal(Integer dd_toformal) {
+        this.dd_toformal = dd_toformal;
+    }
+
+
+    public String getDd_detaildata() {
+        return dd_detaildata;
+    }
+
+    public void setDd_detaildata(String dd_detaildata) {
+        this.dd_detaildata = dd_detaildata == null ? null : dd_detaildata.trim();
+    }
+
+    public String getDd_codevalue() {
+        return dd_codevalue;
+    }
+
+    public void setDd_codevalue(String dd_codevalue) {
+        this.dd_codevalue = dd_codevalue == null ? null : dd_codevalue.trim();
+    }
+
+}

+ 80 - 0
applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/po/DataTemplet.java

@@ -0,0 +1,80 @@
+package com.usoftchina.saas.commons.po;
+
+/**
+ * @author: guq
+ * @create: 2018-11-27 16:20
+ **/
+public class DataTemplet {
+
+    private Integer dt_id;
+
+    private String dt_caller;
+
+    private String dt_description;
+
+    public String getDt_columns() {
+        return dt_columns;
+    }
+
+    public void setDt_columns(String dt_columns) {
+        this.dt_columns = dt_columns;
+    }
+
+    private String dt_title;
+
+    private String dt_columns;
+
+    public Long getCompanyid() {
+        return companyid;
+    }
+
+    public void setCompanyid(Long companyid) {
+        this.companyid = companyid;
+    }
+
+    private String dt_exampledata;
+
+    private Long companyid;
+
+    public Integer getDt_id() {
+        return dt_id;
+    }
+
+    public void setDt_id(Integer dt_id) {
+        this.dt_id = dt_id;
+    }
+
+    public String getDt_caller() {
+        return dt_caller;
+    }
+
+    public void setDt_caller(String dt_caller) {
+        this.dt_caller = dt_caller == null ? null : dt_caller.trim();
+    }
+
+    public String getDt_description() {
+        return dt_description;
+    }
+
+    public void setDt_description(String dt_description) {
+        this.dt_description = dt_description == null ? null : dt_description.trim();
+    }
+
+    public String getDt_title() {
+        return dt_title;
+    }
+
+    public void setDt_title(String dt_title) {
+        this.dt_title = dt_title == null ? null : dt_title.trim();
+    }
+
+    public String getDt_exampledata() {
+        return dt_exampledata;
+    }
+
+    public void setDt_exampledata(String dt_exampledata) {
+        this.dt_exampledata = dt_exampledata == null ? null : dt_exampledata.trim();
+    }
+
+
+}

+ 72 - 0
applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/po/TempletSet.java

@@ -0,0 +1,72 @@
+package com.usoftchina.saas.commons.po;
+
+/**
+ * @author: guq
+ * @create: 2018-11-27 20:52
+ **/
+public class TempletSet {
+    private String description;
+    private int width;
+    private String field;
+    private String necessary;
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    private String position;
+    private boolean codefield;
+    private String type;
+
+    public boolean isCodefield() {
+        return codefield;
+    }
+
+    public void setCodefield(boolean codefield) {
+        this.codefield = codefield;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public void setWidth(int width) {
+        this.width = width;
+    }
+
+    public String getField() {
+        return field;
+    }
+
+    public void setField(String field) {
+        this.field = field;
+    }
+
+    public String getNecessary() {
+        return necessary;
+    }
+
+    public void setNecessary(String necessary) {
+        this.necessary = necessary;
+    }
+
+    public String getPosition() {
+        return position;
+    }
+
+    public void setPosition(String position) {
+        this.position = position;
+    }
+}

+ 6 - 0
applications/commons/commons-server/pom.xml

@@ -65,6 +65,12 @@
             <artifactId>test-starter</artifactId>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.17</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 81 - 0
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/ExcelController.java

@@ -0,0 +1,81 @@
+package com.usoftchina.saas.commons.controller;
+
+import com.usoftchina.saas.auth.client.annotation.IgnoreAuth;
+import com.usoftchina.saas.base.Result;
+import com.usoftchina.saas.commons.service.ExcelService;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.net.URLEncoder;
+import java.util.Map;
+
+/**导入模板下载、解析
+ * @author: guq
+ * @create: 2018-11-26 11:43
+ **/
+@RestController
+@RequestMapping("/excel")
+public class ExcelController {
+
+    @Autowired
+    private ExcelService excelService;
+
+    @RequestMapping("/import/templet")
+    public void CreateTemplet(@RequestParam("caller") String caller, HttpServletResponse response) throws IOException {
+        Map<String, Object> map = excelService.CreateTemplet(caller);
+        SXSSFWorkbook workbook = (SXSSFWorkbook)map.get("workbook");
+        String title = map.get("title").toString();
+        String filename = URLEncoder.encode(title + ".xlsx", "UTF-8");
+        response.setContentType("application/vnd.ms-excel");
+        response.setHeader("Content-Disposition", "attachment;filename=" + filename);
+        OutputStream out;
+        out = response.getOutputStream();
+        workbook.write(out);
+        out.close();
+    }
+
+    @PostMapping(value = "/import/parse", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    public Result ParseTemplet(@RequestParam("caller") String caller, @RequestPart(value = "file") MultipartFile file) throws IOException {
+        InputStream is = null;
+        Workbook wb = null;
+        Integer keyvalue = null;
+        long size = file.getSize();
+        if (size > 104857600) {
+            return Result.error(new String(("{error: '文件过大', size:" + size + "}").getBytes("utf-8"), "iso8859-1"));
+        } else {
+            excelService.clearBefore(caller);
+            String ft = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);
+            is = file.getInputStream();
+            if (ft.equals("xlsx")) {
+                wb = new XSSFWorkbook(is);
+            } else if(ft.equals("xls")){
+                wb = new HSSFWorkbook(is);
+            } else {
+                return Result.error(new String("{error: 'excel文件的格式不太规范,导入失败<hr>可以尝试将文件另存为.xls文件,或将数据选择性粘贴到excel模板,然后导入'}".getBytes("utf-8"),
+                        "iso8859-1"));
+            }
+            keyvalue = excelService.parseTemplet(wb, caller);
+        }
+        return Result.success(keyvalue);
+    }
+
+    @RequestMapping(value = "/test")
+    public Result ParseTemplet(String caller) throws IOException {
+        InputStream is = null;
+        Workbook wb = null;
+        File file = new File("C:\\Users\\guh-pc\\Desktop\\import.xlsx");
+        is = new FileInputStream(file);
+        wb = new XSSFWorkbook(is);
+        excelService.parseTemplet(wb, caller);
+        return Result.success();
+    }
+
+}

+ 10 - 0
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/DataImportDetailMapper.java

@@ -0,0 +1,10 @@
+package com.usoftchina.saas.commons.mapper;
+
+import com.usoftchina.saas.commons.po.DataImportDetail;
+
+public interface DataImportDetailMapper {
+
+    int insertSelective(DataImportDetail record);
+
+    void deleteByIds(String ids);
+}

+ 17 - 0
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/DataImportMapper.java

@@ -0,0 +1,17 @@
+package com.usoftchina.saas.commons.mapper;
+
+import com.usoftchina.saas.commons.po.DataImport;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface DataImportMapper {
+    void deleteByCaller(@Param("caller") String caller, @Param("companyid") Long companyid);
+    int insertSelective(DataImport record);
+
+    void updateErr(@Param("err") String err, @Param("id") Integer id);
+
+    String selectByCaller(@Param("caller") String caller, @Param("companyId") Long companyId);
+
+    void deleteByIds(String ids);
+}

+ 9 - 0
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/DataTempletMapper.java

@@ -0,0 +1,9 @@
+package com.usoftchina.saas.commons.mapper;
+
+import com.usoftchina.saas.commons.po.DataTemplet;
+import org.apache.ibatis.annotations.Param;
+
+public interface DataTempletMapper {
+
+    DataTemplet selectByCaller(@Param("caller") String caller, @Param("companyid") Long companyid);
+}

+ 14 - 0
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/ExcelService.java

@@ -0,0 +1,14 @@
+package com.usoftchina.saas.commons.service;
+
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+
+import java.util.Map;
+
+public interface ExcelService {
+    Map<String, Object> CreateTemplet(String caller);
+
+    void clearBefore(String caller);
+
+    Integer parseTemplet(Workbook wb, String caller);
+}

+ 484 - 0
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/ExcelServiceImpl.java

@@ -0,0 +1,484 @@
+package com.usoftchina.saas.commons.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.usoftchina.saas.commons.dto.ProductBaseDTO;
+import com.usoftchina.saas.commons.exception.BizExceptionCode;
+import com.usoftchina.saas.commons.mapper.DataImportDetailMapper;
+import com.usoftchina.saas.commons.mapper.DataImportMapper;
+import com.usoftchina.saas.commons.mapper.DataTempletMapper;
+import com.usoftchina.saas.commons.po.*;
+import com.usoftchina.saas.commons.service.ExcelService;
+import com.usoftchina.saas.context.BaseContextHolder;
+import com.usoftchina.saas.exception.BizException;
+import com.usoftchina.saas.utils.CollectionUtils;
+import com.usoftchina.saas.utils.StringUtils;
+import org.apache.poi.hssf.util.HSSFColor;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author: guq
+ * @create: 2018-11-26 15:19
+ **/
+@Service
+public class ExcelServiceImpl implements ExcelService{
+
+    @Autowired
+    private DataTempletMapper dataTempletMapper;
+    @Autowired
+    private DataImportMapper dataImportMapper;
+    @Autowired
+    private DataImportDetailMapper dataImportDetailMapper;
+
+    @Override
+    public Map<String, Object> CreateTemplet(String caller) {
+        Long companyId = BaseContextHolder.getCompanyId();
+        Map<String, Object> map = new HashMap<>();
+        SXSSFWorkbook workbook = new SXSSFWorkbook();
+        DataTemplet dataTemplet = dataTempletMapper.selectByCaller(caller, companyId);
+        String cols = dataTemplet.getDt_columns();
+      /*  String cols = "[{\"description\":\"物料编号\",\"necessary\":\"true\"},{\"description\":\"物料名称\",\"necessary\":\"true\"},{\"description\":\"物料类型\",\"necessary\":\"true\"},{\"description\":\"仓库编号\",\"necessary\":\"true\"},{\"description\":\"仓库名称\",\"necessary\":\"true\"}]";
+        cols = "[{\"description\":\"物料编号\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_code\",\"codefield\":true}," +
+                "{\"description\":\"物料名称\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_detail\",\"codefield\":false}," +
+                "{\"description\":\"更新时间\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"updateTime\",\"codefield\":false,\"type\":\"date\"}," +
+                "{\"description\":\"规格\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_spec\",\"codefield\":false}," +
+                "{\"description\":\"类型\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_kind\",\"codefield\":false}," +
+                "{\"description\":\"型号\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_orispeccode\",\"codefield\":false}" +
+                ",{\"description\":\"品牌\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_brand\",\"codefield\":false}," +
+                "{\"description\":\"单位\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_unit\",\"codefield\":false}," +
+                "{\"description\":\"仓库编号\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_whcode\",\"codefield\":false}," +
+                "{\"description\":\"仓库名称\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_whname\",\"codefield\":false}," +
+                "{\"description\":\"最新采购单价\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_purcprice\",\"codefield\":false}" +
+                ",{\"description\":\"最新出货单价\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_saleprice\",\"codefield\":false}," +
+                "{\"description\":\"替代料仓库编号\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_whcode\",\"codefield\":false}," +
+                "{\"description\":\"替代料仓库名称\",\"necessary\":\"false\",\"position\":\"detail\",\"field\":\"pd_whname\",\"codefield\":false}," +
+                "{\"description\":\"期初数量\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_num\",\"codefield\":false}," +
+                "{\"description\":\"单位成本\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_price\",\"codefield\":false}]";
+      */
+        JSONArray array = (JSONArray) JSONArray.parse(cols);
+        String remark = dataTemplet.getDt_description();
+        //String exampledata = dataTemplet.getDt_exampledata();
+        //JSONArray datas = (JSONArray) JSONArray.parse(exampledata);
+        JSONArray datas = new JSONArray();
+        JSONObject data = new JSONObject();
+        data.put("物料编号", "code1");
+        data.put("物料名称", "name1");
+        data.put("规格", "spec1");
+        data.put("型号", "kind1");
+        data.put("品牌", "brand1");
+        data.put("更新时间", "2018-09-08");
+        data.put("单位", "nuit1");
+        data.put("类型", "leixin1");
+        data.put("仓库编号", "whcode1");
+        data.put("仓库名称", "whname1");
+        data.put("最新采购单价", "100");
+        data.put("最新出货单价", "22");
+        data.put("替代料仓库编号", "tcode1");
+        data.put("替代料仓库名称", "tname1");
+        data.put("期初数量", "22");
+        data.put("单位成本", "22");
+        datas.add(data);
+        JSONObject data2 = new JSONObject();
+        data2.put("物料编号", "code2");
+        data2.put("物料名称", "name2");
+        data2.put("规格", "spec2");
+        data2.put("型号", "kind2");
+        data2.put("品牌", "brand2");
+        data2.put("单位", "nuit2");
+        data2.put("类型", "leixin2");
+        data2.put("仓库编号", "whcode2");
+        data2.put("仓库名称", "whname2");
+        data2.put("最新采购单价", "100");
+        data2.put("最新出货单价", "22");
+        data2.put("替代料仓库编号", "tcode2");
+        data2.put("替代料仓库名称", "tname2");
+        data2.put("期初数量", "22");
+        data2.put("单位成本", "22");
+        datas.add(data2);
+        System.out.println(datas.toJSONString());
+        createWorkbook(workbook, 1, array, datas, remark);
+        map.put("workbook", workbook);
+        map.put("title", dataTemplet.getDt_title());
+        return map;
+    }
+
+    @Override
+    public void clearBefore(String caller) {
+        Long companyId = BaseContextHolder.getCompanyId();
+        String ids = dataImportMapper.selectByCaller(caller, companyId);
+        if (!StringUtils.isEmpty(ids)) {
+            dataImportDetailMapper.deleteByIds(ids);
+            dataImportMapper.deleteByIds(ids);
+        };
+
+    }
+
+    @Override
+    @Transactional
+    public Integer parseTemplet(Workbook wb, String caller) {
+        if (wb == null || StringUtils.isEmpty(caller)) {
+            throw new BizException(BizExceptionCode.NULL_DATA);
+        }
+        Long companyId = BaseContextHolder.getCompanyId();
+        DataImport di = new DataImport();
+        di.setCompanyid(companyId);
+        di.setDi_caller(caller);
+        di.setDi_date(new Date());
+        di.setDi_man(BaseContextHolder.getUserName());
+        di.setDi_toformal(0);
+        di.setDi_success(0);
+        List<Map<String,String>> datas = new ArrayList<Map<String,String>>();
+        String cols = "[{\"description\":\"物料编号\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_code\",\"codefield\":true}," +
+                "{\"description\":\"物料名称\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_detail\",\"codefield\":false},{\"description\":\"规格\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_spec\",\"codefield\":false},{\"description\":\"类型\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_kind\",\"codefield\":false},{\"description\":\"型号\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_orispeccode\",\"codefield\":false}" +
+                ",{\"description\":\"品牌\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_brand\",\"codefield\":false},{\"description\":\"单位\",\"necessary\":\"true\",\"position\":\"main\",\"field\":\"pr_unit\",\"codefield\":false},{\"description\":\"仓库编号\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_whcode\",\"codefield\":false},{\"description\":\"仓库名称\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_whname\",\"codefield\":false},{\"description\":\"最新采购单价\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_purcprice\",\"codefield\":false}" +
+                ",{\"description\":\"最新出货单价\",\"necessary\":\"false\",\"position\":\"main\",\"field\":\"pr_saleprice\",\"codefield\":false},{\"description\":\"替代料仓库编号\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_whcode\",\"codefield\":false},{\"description\":\"替代料仓库名称\",\"necessary\":\"false\",\"position\":\"detail\",\"field\":\"pd_whname\",\"codefield\":false},{\"description\":\"期初数量\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_num\",\"codefield\":false},{\"description\":\"单位成本\",\"necessary\":\"true\",\"position\":\"detail\",\"field\":\"pd_price\",\"codefield\":false}]";
+        //前端列表信息
+        List<TempletSet> templetSets = JSONArray.parseArray(cols, TempletSet.class);
+        Map<String, List<TempletSet>> columns = CollectionUtils.groupBy(templetSets, TempletSet::getPosition);
+        List<String> positions = SetToList(columns.keySet());
+        String cellData = null;
+        String codeValue = null;
+        //读取默认从第2行开始读取
+        List<String> keys = new ArrayList<>();
+        //获取第一个sheet
+        Sheet sheet = wb.getSheetAt(0);
+        //获取最大行数
+        int rownum = sheet.getPhysicalNumberOfRows();
+        if (rownum < 3) {
+            throw new BizException(12324, "请先填写数据");
+        }
+        //获取第2行
+        Row row = sheet.getRow(1);
+        //获取最大列数
+        int colnum = row.getPhysicalNumberOfCells();
+        String key = null;
+        //添加keys
+        for (int j = 0;j < colnum; j++){
+            key = (String) getCellFormatValue(row.getCell(j));
+            keys.add(key);
+        }
+        //存储数据
+        for (int i = 2; i < rownum; i++) {
+            Map<String,String> map = new LinkedHashMap<String,String>();
+            row = sheet.getRow(i);
+            if(row !=null){
+                for (int j = 0;j < colnum; j++){
+                    cellData = (String) getCellFormatValue(row.getCell(j));
+                    //检测字段必填与否
+                    map.put(keys.get(j), cellData);
+                }
+            }else{
+                break;
+            }
+            datas.add(map);
+        }
+        dataImportMapper.insertSelective(di);
+        Integer keyvalue = di.getDi_id();
+        //数据转换成字段
+        if (!CollectionUtils.isEmpty(datas)) {
+            StringBuilder err = new StringBuilder();
+            JSONArray mains = new JSONArray();
+            JSONArray details = new JSONArray();
+            boolean flag = false;
+            //数据行循环
+            for (int i = 0; i < datas.size(); i++) {
+                Map<String,String> data = datas.get(i);
+                DataImportDetail dd = new DataImportDetail();
+                //界面值
+                String value = null;
+                JSONObject mainData = null;
+                JSONObject detailData = null;
+                dd.setCompanyid(companyId);
+                dd.setDd_diid(keyvalue);
+                //主从表循环
+                for (int j = 0; j < positions.size(); j++) {
+                   String position = positions.get(j);
+                    //标识是否一个主表的数据
+                   boolean difference = true;
+                    //依据主从表分类
+                   if ("main".equals(position)) {
+                       List<TempletSet> main = columns.get(position);
+                       for (TempletSet set : main) {
+                           //取excel值
+                           if ("true".equals(set.getNecessary())) {
+                               value = data.get("*" + set.getDescription());
+                           } else {
+                               value = data.get(set.getDescription());
+                           }
+                           //取编号字段
+                           if (set.isCodefield() && !data.get("*" + set.getDescription()).equals("")) {
+                               mainData = new JSONObject();
+                               codeValue = value;
+                               difference = true;
+                           }
+                           //检查是否是同一单
+                           if (set.isCodefield() && data.get("*" + set.getDescription()).equals("")) {
+                               difference = false;
+                               break;
+                           }
+                           //检查主表必填字段是否完整
+                           if (difference) {
+                               dd.setDd_codevalue(codeValue);
+                               if ("true".equals(set.getNecessary()) && data.get("*" + set.getDescription()).equals("")) {
+                                   err.append("第" + (i + 2) + "行 " + set.getDescription() + " 必填字段未填写! ");
+                                   break;
+                               }
+                           }
+                           //检测日期类型是否规范
+                           if ("date".equals(set.getType())) {
+                               flag = validateDateFormat(value);
+                               if (!flag) {
+                                   err.append("第" + (i + 2) + "行 " + set.getDescription() + " 日期格式不正确! ");
+                                   break;
+                               }
+                           }
+                           //插入主表数据
+                           if (null != mainData) {
+                               if ("true".equals(set.getNecessary())) {
+                                   mainData.put(set.getField(), value);
+                               } else {
+                                   mainData.put(set.getField(), value);
+                               }
+                           }
+                       }
+                       //所有主表数据进行分类
+                       if (null != mainData) {
+                           //mains.add(mainData);
+                           dd.setDd_maindata(mainData.toJSONString());
+                       }
+                   } else {
+                       //从表字段
+                       List<TempletSet> detail = columns.get(position);
+                       detailData = new JSONObject();
+                       for (TempletSet set : detail) {
+                           //取excel值
+                           if ("true".equals(set.getNecessary())) {
+                               value = data.get("*" + set.getDescription());
+                           } else {
+                               value = data.get(set.getDescription());
+                           }
+                           //拼从表数据
+                           if ("true".equals(set.getNecessary())) {
+                               detailData.put(set.getField(), data.get("*" + set.getDescription()));
+                           } else {
+                               detailData.put(set.getField(), data.get(set.getDescription()));
+                           }
+                           if ("true".equals(set.getNecessary()) && data.get("*" + set.getDescription()).equals("")) {
+                               err.append("第" + (i + 2) + "行 " + set.getDescription() + " 必填字段未填写! ");
+                               break;
+                           }
+                           //检测日期类型是否规范
+                           if ("date".equals(set.getType())) {
+                               flag = validateDateFormat(value);
+                               if (!flag) {
+                                   err.append("第" + (i + 2) + "行 " + set.getDescription() + " 日期格式不正确! ");
+                                   break;
+                               }
+                           }
+                       }
+                       if (detailData.size() > 0) {
+                           dd.setDd_codevalue(codeValue);
+                           dd.setDd_detaildata(detailData.toJSONString());
+                       }
+                   }
+                }
+                dataImportDetailMapper.insertSelective(dd);
+            }
+            //必填项检查
+            if (err.length() > 0) {
+                dataImportMapper.updateErr(err.toString(), keyvalue);
+                throw new BizException(123456789, err.toString());
+            }
+        }
+        return keyvalue;
+    }
+
+
+
+    private boolean validateDateFormat(String date) {
+        boolean flag = false;
+        if (StringUtils.isEmpty(date)) {
+            return false;
+        }
+        String regEx1 = "[0-9]{8}";
+        String regEX2 = "[0-9]{4}-[0-9]{2}-[0-9]{2}";
+        // 编译正则表达式
+        Pattern pattern1 = Pattern.compile(regEx1);
+        Pattern pattern2 = Pattern.compile(regEX2);
+        Matcher matcher = pattern1.matcher(date);
+        // 字符串是否与正则表达式相匹配
+        flag = matcher.matches();
+        if (!flag) {
+            flag = pattern2.matcher(date).matches();
+        }
+        return flag;
+    }
+
+    //保证先遍历主表
+    private List<String> SetToList(Set<String> sets) {
+        List<String> list = new ArrayList<>();
+        list.add("main");
+        for (String str : sets) {
+            if (!"main".equals(str)) {
+                list.add(str);
+            }
+        }
+        return list;
+    }
+
+    public static Object getCellFormatValue(Cell cell){
+        Object cellValue = null;
+        if(cell!=null){
+            //判断cell类型
+            switch(cell.getCellType()){
+                case Cell.CELL_TYPE_NUMERIC:{
+                    cellValue = String.valueOf(cell.getNumericCellValue());
+                    break;
+                }
+                case Cell.CELL_TYPE_FORMULA:{
+                    //判断cell是否为日期格式
+                    if(DateUtil.isCellDateFormatted(cell)){
+                        //转换为日期格式YYYY-mm-dd
+                        cellValue = cell.getDateCellValue();
+                    }else{
+                        //数字
+                        cellValue = String.valueOf(cell.getNumericCellValue());
+                    }
+                    break;
+                }
+                case Cell.CELL_TYPE_STRING:{
+                    cellValue = cell.getRichStringCellValue().getString();
+                    break;
+                }
+                default:
+                    cellValue = "";
+            }
+        }else{
+            cellValue = "";
+        }
+        return cellValue;
+    }
+
+
+    protected Cell getCell(Sheet sheet, int row, int col) {
+        Row sheetRow = sheet.getRow(row);
+        if (sheetRow == null) {
+            sheetRow = sheet.createRow(row);
+        }
+        Cell cell = sheetRow.getCell(col);
+        if (cell == null) {
+            cell = sheetRow.createCell(col);
+        }
+        return cell;
+    }
+
+    /**
+     * 生成excel工作表
+     *
+     * 数据
+     */
+    private void createWorkbook(SXSSFWorkbook workbook, int sheetIdx, JSONArray cols, JSONArray datas, String remark){
+        Sheet sheet = workbook.createSheet("sheet" + sheetIdx);
+        CellStyle style = getCellStyle(workbook);
+        //sheet.autoSizeColumn((short) 2);
+        sheet.createFreezePane(0, 1);// 固定列
+        Cell cell = null;
+        int rIdx = 0;
+        int cIdx = 0;
+        short width = 0;
+        DataFormat format = workbook.createDataFormat();
+        Row row = null;
+        if (remark != null) {
+            row = sheet.createRow(rIdx);
+            row.setHeightInPoints((short) 100);
+            sheet.setColumnWidth(cIdx, 1000);
+            cell = getCell(sheet, rIdx, cIdx);
+            cell.setCellValue(remark);
+            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, cols.size() - 1));
+            rIdx++;
+        }
+        row = sheet.createRow(rIdx);
+        row.setHeightInPoints((short) 22);
+        List<String> keys = new ArrayList<String>();
+        if (!CollectionUtils.isEmpty(cols)) {
+            String value = "";
+            //列出主表的列
+            for (int i = 0; i < cols.size(); i++) {
+                JSONObject obj = (JSONObject) cols.get(i);
+                width = (short) (obj.get("width") == null ? 0 : (int)obj.get("width")*35.7);
+                width = width == 0 ? 4000 : width;
+                sheet.setColumnWidth(cIdx, width);
+                sheet.createFreezePane(cols.size() + 1, 2);
+                cell = getCell(sheet, rIdx, cIdx);
+                value = obj.get("description") == null ? value : obj.get("description").toString();
+                if ("true".equals(obj.get("necessary"))) {
+                    value = "*" + value;
+                }
+                cell.setCellValue(value);
+                keys.add(String.valueOf(obj.get("description")));
+                if ("date".equals(obj.get("type"))) {
+                    short df= workbook.createDataFormat().getFormat("yyyy-MM-dd");
+                    style.setDataFormat(df);
+                }
+                cell.setCellStyle(style);
+                cIdx++;
+                value = "";
+            }
+            rIdx++;
+            if (!CollectionUtils.isEmpty(datas)) {
+                for(Object d :datas) {
+                    JSONObject data = (JSONObject)d;
+                    cIdx = 0;
+                    row = sheet.createRow(rIdx);
+                    row.setHeightInPoints((short) 20);
+                    for (String key : keys) {
+                        Cell c = getCell(sheet, rIdx, cIdx);
+                        if (data.get(key) != null) {
+                            String v = String.valueOf(data.get(key));
+                            if ("".equals(v) || "null".equals(v)) {
+                                c.setCellValue(0);
+                            } else if (!v.matches("^-?[0-9]+(.[0-9]+)?")) {
+                                c.setCellValue(v);
+                            } else {
+                                c.setCellValue(Double.parseDouble(v.replace(",", "")));
+                            }
+                        } else {
+                            c.setCellValue("");
+                        }
+                        cIdx++;
+                    }
+                    rIdx++;
+                }
+            }
+        }
+    }
+
+    private CellStyle getCellStyle(SXSSFWorkbook workbook) {
+        CellStyle style = workbook.createCellStyle();
+        style.setFillBackgroundColor((short) 18);
+        style.setFillPattern(FillPatternType.LEAST_DOTS);
+        Font font = workbook.createFont();
+        font.setFontName("仿宋_GB2312");// 字体
+        font.setFontHeightInPoints((short) 12);// 字号
+        font.setColor((short)64);// 颜色
+        style.setFont(font);
+        style.setAlignment(HorizontalAlignment.CENTER);
+        style.setFillForegroundColor(HSSFColor.GREEN.index);
+        style.setFillBackgroundColor(HSSFColor.PALE_BLUE.index);
+        style.setBorderBottom(BorderStyle.MEDIUM);
+        style.setBorderLeft(BorderStyle.MEDIUM);
+        style.setBorderRight(BorderStyle.MEDIUM);
+        style.setBorderTop(BorderStyle.MEDIUM);
+        return style;
+    }
+
+}

+ 83 - 0
applications/commons/commons-server/src/main/resources/mapper/DataImportDetailMapper.xml

@@ -0,0 +1,83 @@
+<?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.commons.mapper.DataImportDetailMapper" >
+  <resultMap id="BaseResultMap" type="com.usoftchina.saas.commons.po.DataImportDetail" >
+    <id column="dd_id" property="dd_id" jdbcType="INTEGER" />
+    <result column="dd_maindata" property="dd_maindata" jdbcType="VARCHAR" />
+    <result column="dd_detno" property="dd_detno" jdbcType="INTEGER" />
+    <result column="dd_diid" property="dd_diid" jdbcType="INTEGER" />
+    <result column="dd_checked" property="dd_checked" jdbcType="INTEGER" />
+    <result column="dd_success" property="dd_success" jdbcType="INTEGER" />
+    <result column="dd_toformal" property="dd_toformal" jdbcType="INTEGER" />
+    <result column="companyid" property="companyid" jdbcType="INTEGER" />
+    <result column="dd_detaildata" property="dd_detaildata" jdbcType="VARCHAR" />
+    <result column="dd_codevalue" property="dd_codevalue" jdbcType="VARCHAR" />
+  </resultMap>
+
+  <delete id="deleteByIds">
+    delete from data_importdetail where dd_diid in (${ids})
+  </delete>
+
+  <insert id="insertSelective" parameterType="com.usoftchina.saas.commons.po.DataImportDetail" >
+    insert into data_importdetail
+    <trim prefix="(" suffix=")" suffixOverrides="," >
+      <if test="dd_maindata != null" >
+        dd_maindata,
+      </if>
+      <if test="dd_detno != null" >
+        dd_detno,
+      </if>
+      <if test="dd_diid != null" >
+        dd_diid,
+      </if>
+      <if test="dd_checked != null" >
+        dd_checked,
+      </if>
+      <if test="dd_success != null" >
+        dd_success,
+      </if>
+      <if test="dd_toformal != null" >
+        dd_toformal,
+      </if>
+      <if test="companyid != null" >
+        companyid,
+      </if>
+      <if test="dd_detaildata != null" >
+        dd_detaildata,
+      </if>
+      <if test="dd_codevalue != null" >
+        dd_codevalue,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides="," >
+      <if test="dd_maindata != null" >
+        #{dd_maindata,jdbcType=VARCHAR},
+      </if>
+      <if test="dd_detno != null" >
+        #{dd_detno,jdbcType=INTEGER},
+      </if>
+      <if test="dd_diid != null" >
+        #{dd_diid,jdbcType=INTEGER},
+      </if>
+      <if test="dd_checked != null" >
+        #{dd_checked,jdbcType=INTEGER},
+      </if>
+      <if test="dd_success != null" >
+        #{dd_success,jdbcType=INTEGER},
+      </if>
+      <if test="dd_toformal != null" >
+        #{dd_toformal,jdbcType=INTEGER},
+      </if>
+      <if test="companyid != null" >
+        #{companyid,jdbcType=INTEGER},
+      </if>
+      <if test="dd_detaildata != null" >
+        #{dd_detaildata,jdbcType=VARCHAR},
+      </if>
+      <if test="dd_codevalue != null" >
+        #{dd_codevalue,jdbcType=VARCHAR},
+      </if>
+    </trim>
+  </insert>
+
+ </mapper>

+ 83 - 0
applications/commons/commons-server/src/main/resources/mapper/DataImportMapper.xml

@@ -0,0 +1,83 @@
+<?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.commons.mapper.DataImportMapper" >
+<delete id="deleteByCaller">
+  delete from data_import where di_caller=#{caller} and companyid=#{companyid} and
+  il_toformal=0 and il_result is not null
+</delete>
+  <delete id="deleteByIds">
+    delete from data_import where di_id in (${ids});
+  </delete>
+
+  <insert id="insertSelective" parameterType="com.usoftchina.saas.commons.po.DataImport" >
+    <selectKey  resultType="java.lang.Integer" keyProperty="di_id">
+      SELECT LAST_INSERT_ID() AS ID
+    </selectKey>
+    insert into data_import
+    <trim prefix="(" suffix=")" suffixOverrides="," >
+      <if test="di_caller != null" >
+        di_caller,
+      </if>
+      <if test="companyid != null" >
+        companyid,
+      </if>
+      <if test="di_date != null" >
+        di_date,
+      </if>
+      <if test="di_count != null" >
+        di_count,
+      </if>
+      <if test="di_result != null" >
+        di_result,
+      </if>
+      <if test="di_success != null" >
+        di_success,
+      </if>
+      <if test="di_man != null" >
+        di_man,
+      </if>
+      <if test="di_toformal != null" >
+        di_toformal,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides="," >
+      <if test="di_caller != null" >
+        #{di_caller,jdbcType=VARCHAR},
+      </if>
+      <if test="companyid != null" >
+        #{companyid,jdbcType=INTEGER},
+      </if>
+      <if test="di_date != null" >
+        #{di_date,jdbcType=TIMESTAMP},
+      </if>
+      <if test="di_count != null" >
+        #{di_count,jdbcType=INTEGER},
+      </if>
+      <if test="di_result != null" >
+        #{di_result,jdbcType=VARCHAR},
+      </if>
+      <if test="di_success != null" >
+        #{di_success,jdbcType=INTEGER},
+      </if>
+      <if test="di_man != null" >
+        #{di_man,jdbcType=VARCHAR},
+      </if>
+      <if test="di_toformal != null" >
+        #{di_toformal,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+
+  <update id="updateErr" >
+    update data_import
+    set
+    di_result = #{err},
+    di_success = 0,
+    where di_id = #{id}
+  </update>
+
+
+  <select id="selectByCaller" resultType="string">
+    select group_concat(di_id) from data_import where di_caller=#{caller} and di_toformal=0 and di_result is not null
+  </select>
+</mapper>

+ 17 - 0
applications/commons/commons-server/src/main/resources/mapper/DataTempletMapper.xml

@@ -0,0 +1,17 @@
+<?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.commons.mapper.DataTempletMapper" >
+  <resultMap id="BaseResultMap" type="com.usoftchina.saas.commons.po.DataTemplet" >
+    <id column="dt_id" property="dt_id" jdbcType="INTEGER" />
+    <result column="dt_caller" property="dt_caller" jdbcType="VARCHAR" />
+    <result column="dt_description" property="dt_description" jdbcType="VARCHAR" />
+    <result column="dt_title" property="dt_title" jdbcType="VARCHAR" />
+    <result column="dt_exampledata" property="dt_exampledata" jdbcType="VARCHAR" />
+    <result column="companyid" property="companyid" jdbcType="INTEGER" />
+    <result column="dt_columns" property="dt_columns" jdbcType="VARCHAR"/>
+  </resultMap>
+
+  <select id="selectByCaller" resultMap="BaseResultMap">
+    select * from data_Templet where dt_caller=#{caller} and companyid = #{companyid}
+  </select>
+</mapper>

+ 7 - 2
applications/document/document-server/src/main/java/com/usoftchina/saas/document/controller/ProductController.java

@@ -16,9 +16,7 @@ import com.usoftchina.saas.page.PageRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 @RestController
 @RequestMapping("/product")
@@ -107,4 +105,11 @@ public class ProductController {
         return Result.success(productService.getReserveCost(page, listReqDTO));
     }
 
+    //导入保存至列表
+    @RequestMapping("/saveToFormal")
+    public Result saveToFormal(Integer id, boolean update) {
+        productService.saveToFormal(id, update);
+        return Result.success();
+    }
+
 }

+ 22 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/DataImportMapper.java

@@ -0,0 +1,22 @@
+package com.usoftchina.saas.document.mapper;
+
+import com.usoftchina.saas.commons.po.DataImport;
+import com.usoftchina.saas.commons.po.DataImportDetail;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface DataImportMapper {
+    void deleteByCaller(@Param("caller") String caller, @Param("companyid") Long companyid);
+    int insertSelective(DataImport record);
+
+    void updateErr(@Param("err") String err, @Param("id") Integer id);
+
+    List<DataImportDetail> selectDataById(Integer id);
+
+    DataImportDetail selectProductBycode(@Param("code") String code, @Param("id") int id, @Param("companyid") Long companyId);
+
+    void updateDataImport(Integer id);
+
+    void updateDataImportError(@Param("err") String err,@Param("id") int id);
+}

+ 2 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/ProductMapper.java

@@ -48,4 +48,6 @@ public interface ProductMapper extends CommonBaseMapper<Product> {
     boolean deleteProdIOByCode(@Param("code") String code, @Param("companyId") Long companyId);
 
     boolean deleteProdIODetailByCode(@Param("code") String code, @Param("companyId") Long companyId);
+
+    Long selectIdByCode(@Param("code") String code, @Param("companyId") Long companyId);
 }

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

@@ -44,4 +44,6 @@ public interface WarehouseMapper extends CommonBaseMapper<Warehouse> {
     int selectCountByCode(@Param("code") String code, @Param("companyId") Long companyId, @Param("id") Long id);
 
     int deleteCheckProdIO(@Param("id") Long id, @Param("companyId") Long companyId);
+
+    Warehouse selectWareHouse(@Param("code") String code, @Param("companyId") Long companyId);
 }

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

@@ -17,6 +17,7 @@ import com.usoftchina.saas.document.mapper.ProductMapper;
 import com.usoftchina.saas.page.PageRequest;
 
 import java.util.List;
+import java.util.Map;
 
 public interface ProductService extends CommonBaseService<ProductMapper, Product> {
 
@@ -109,7 +110,7 @@ public interface ProductService extends CommonBaseService<ProductMapper, Product
      * @param listReqDTO
      * @return
      */
-    PageInfo<ProductReserveCostDTO> getReserveCost(PageRequest page, ListReqDTO listReqDTO);
+    Map<String, Object> getReserveCost(PageRequest page, ListReqDTO listReqDTO);
 
     /**
      * 通过明细ID删除明细
@@ -117,4 +118,6 @@ public interface ProductService extends CommonBaseService<ProductMapper, Product
      * @return
      */
     boolean deleteDetailById(Long id);
+
+    void saveToFormal(Integer id, boolean update);
 }

+ 95 - 3
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/ProductServiceImpl.java

@@ -1,8 +1,8 @@
 package com.usoftchina.saas.document.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
@@ -12,6 +12,7 @@ import com.usoftchina.saas.commons.dto.DocBaseDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.commons.exception.BizExceptionCode;
 import com.usoftchina.saas.commons.po.BillCodeSeq;
+import com.usoftchina.saas.commons.po.DataImportDetail;
 import com.usoftchina.saas.commons.po.Operation;
 import com.usoftchina.saas.commons.po.Status;
 import com.usoftchina.saas.context.BaseContextHolder;
@@ -19,12 +20,15 @@ import com.usoftchina.saas.document.dto.ProductDTO;
 import com.usoftchina.saas.document.dto.ProductListDTO;
 import com.usoftchina.saas.document.dto.ProductReserveCostDTO;
 import com.usoftchina.saas.document.entities.*;
+import com.usoftchina.saas.document.mapper.DataImportMapper;
 import com.usoftchina.saas.document.mapper.ProductDetailMapper;
 import com.usoftchina.saas.document.mapper.ProductMapper;
+import com.usoftchina.saas.document.mapper.WarehouseMapper;
 import com.usoftchina.saas.document.service.ProductService;
 import com.usoftchina.saas.document.service.WarehouseService;
 import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.page.PageRequest;
+import com.usoftchina.saas.utils.CollectionUtils;
 import com.usoftchina.saas.utils.RegexpUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -44,6 +48,10 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
     private WarehouseService warehouseService;
     @Autowired
     private ProductDetailMapper productDetailMapper;
+    @Autowired
+    private DataImportMapper dataImportMapper;
+    @Autowired
+    private WarehouseMapper warehouseMapper;
 
     @Override
     public PageInfo<ProductDTO> getProductsByCondition(PageRequest page, ListReqDTO listReqDTO) {
@@ -481,7 +489,8 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
     }
 
     @Override
-    public PageInfo<ProductReserveCostDTO> getReserveCost(PageRequest page, ListReqDTO listReqDTO) {
+    public Map<String, Object> getReserveCost(PageRequest page, ListReqDTO listReqDTO) {
+        Map<String, Object> map = new HashMap<String, Object>();
         //设置分页
         if (null == page || page.getSize() == 0 || page.getNumber() == 0) {
             page = new PageRequest();
@@ -492,7 +501,9 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
         List<ProductReserveCostDTO> reserveCostList = geReserveCost(listReqDTO);
         //取分页信息
         PageInfo<ProductReserveCostDTO> pageInfo = new PageInfo<ProductReserveCostDTO>(reserveCostList);
-        return pageInfo;
+        map.put("list", pageInfo);
+        map.put("calculate", null);
+        return map;
     }
 
     @Override
@@ -518,6 +529,87 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
         return true;
     }
 
+
+
+    @Override
+    public void saveToFormal(Integer id, boolean update) {
+        if (null == id || "0".equals(id)) {
+            return;
+        }
+        Long companyId = BaseContextHolder.getCompanyId();
+        StringBuilder err = new StringBuilder();
+        List<ProductListDTO> list = new ArrayList<>();
+        ProductListDTO listDTO = null;
+        List<DataImportDetail> details = dataImportMapper.selectDataById(id);
+        if (!CollectionUtils.isEmpty(details)) {
+            Map<String, List<DataImportDetail>> datas = CollectionUtils.groupBy(details, DataImportDetail::getDd_codevalue);
+            Integer detno = null;
+            for (String code : datas.keySet()) {
+                listDTO = new ProductListDTO();
+                List<ProductDetail> productDetails = new ArrayList<>();
+                int i = getMapper().validateCodeWhenInsert(code, companyId);
+                List<DataImportDetail> data = datas.get(code);
+                DataImportDetail main = dataImportMapper.selectProductBycode(code, id, companyId);
+                Product product = JSONObject.parseObject(main.getDd_maindata(), Product.class);
+                Warehouse warehouse = null;
+                //验证仓库
+                if (!StringUtils.isEmpty(product.getPr_whcode())) {
+                    warehouse = warehouseMapper.selectWareHouse(product.getPr_whcode(), companyId);
+                    if (null == warehouse) {
+                        err.append("物料编号为: " + product.getPr_code() + " 的物料仓库: "+ product.getPr_whname() +" 在系统中不存在,请确认数据是否正确");
+                        break;
+                    }
+                    product.setPr_whid(warehouse.getId());
+                    product.setPr_status(Status.OPEN.getDisplay());
+                    product.setPr_statuscode(Status.OPEN.name());
+                }
+                //添加从表
+                if (data.size() > 0) {
+                    detno = 1;
+                    for (DataImportDetail productDetail : data) {
+                        ProductDetail detail = JSONObject.parseObject(productDetail.getDd_detaildata(), ProductDetail.class);
+                        if (null != detail) {
+                            //验证仓库
+                            if (!StringUtils.isEmpty(product.getPr_whcode())) {
+                                warehouse = warehouseMapper.selectWareHouse(detail.getPd_whcode(), companyId);
+                                if (null == warehouse) {
+                                    err.append("物料编号为: " + product.getPr_code() + " 的物料仓库: "+ product.getPr_whname() +" 在系统中不存在,请确认数据是否正确");
+                                    break;
+                                }
+                                detail.setPd_whid(Integer.valueOf(warehouse.getId().toString()));
+                                detail.setPd_detno(detno);
+                                detno++;
+                            }
+                            productDetails.add(detail);
+                        }
+                    }
+                }
+                //编号不存在
+                if (i == 0) {
+                    product.setId(0l);
+                //编号存在、需要更新
+                } else if (update){
+                    Long pr_id = getMapper().selectIdByCode(code, companyId);
+                    product.setId(pr_id);
+                //编号存在、不需要处理
+                } else {
+                    continue;
+                }
+                listDTO.setMain(product);
+                listDTO.setItems(productDetails);
+                list.add(listDTO);
+            }
+            if (err.length() > 0) {
+                dataImportMapper.updateDataImportError(err.toString(), id);
+                throw new BizException(12345, err.toString());
+            }
+            for (ProductListDTO  dto : list) {
+                saveData(dto);
+            }
+            dataImportMapper.updateDataImport(id);
+        }
+    }
+
     private List<ProductReserveCostDTO> geReserveCost(ListReqDTO listReqDTO) {
         Long companyId = BaseContextHolder.getCompanyId();
         String condition = listReqDTO.getFinalCondition();

+ 105 - 0
applications/document/document-server/src/main/resources/mapper/DataImportMapper.xml

@@ -0,0 +1,105 @@
+<?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.document.mapper.DataImportMapper" >
+  <resultMap id="DetailMap" type="com.usoftchina.saas.commons.po.DataImportDetail" >
+    <id column="dd_id" property="dd_id" jdbcType="INTEGER" />
+    <result column="dd_maindata" property="dd_maindata" jdbcType="VARCHAR" />
+    <result column="dd_detno" property="dd_detno" jdbcType="INTEGER" />
+    <result column="dd_diid" property="dd_diid" jdbcType="INTEGER" />
+    <result column="dd_checked" property="dd_checked" jdbcType="INTEGER" />
+    <result column="dd_success" property="dd_success" jdbcType="INTEGER" />
+    <result column="dd_toformal" property="dd_toformal" jdbcType="INTEGER" />
+    <result column="companyid" property="companyid" jdbcType="INTEGER" />
+    <result column="dd_detaildata" property="dd_detaildata" jdbcType="VARCHAR" />
+    <result column="dd_codevalue" property="dd_codevalue" jdbcType="VARCHAR" />
+  </resultMap>
+
+  <delete id="deleteByCaller">
+  delete from data_import where di_caller=#{caller} and companyid=#{companyid} and
+  il_toformal=0 and il_result is not null
+</delete>
+
+  <insert id="insertSelective" parameterType="com.usoftchina.saas.commons.po.DataImport" >
+    <selectKey  resultType="java.lang.Integer" keyProperty="di_id">
+      SELECT LAST_INSERT_ID() AS ID
+    </selectKey>
+    insert into data_import
+    <trim prefix="(" suffix=")" suffixOverrides="," >
+      <if test="di_caller != null" >
+        di_caller,
+      </if>
+      <if test="companyid != null" >
+        companyid,
+      </if>
+      <if test="di_date != null" >
+        di_date,
+      </if>
+      <if test="di_count != null" >
+        di_count,
+      </if>
+      <if test="di_result != null" >
+        di_result,
+      </if>
+      <if test="di_success != null" >
+        di_success,
+      </if>
+      <if test="di_man != null" >
+        di_man,
+      </if>
+      <if test="di_toformal != null" >
+        di_toformal,
+      </if>
+    </trim>
+    <trim prefix="values (" suffix=")" suffixOverrides="," >
+      <if test="di_caller != null" >
+        #{di_caller,jdbcType=VARCHAR},
+      </if>
+      <if test="companyid != null" >
+        #{companyid,jdbcType=INTEGER},
+      </if>
+      <if test="di_date != null" >
+        #{di_date,jdbcType=TIMESTAMP},
+      </if>
+      <if test="di_count != null" >
+        #{di_count,jdbcType=INTEGER},
+      </if>
+      <if test="di_result != null" >
+        #{di_result,jdbcType=VARCHAR},
+      </if>
+      <if test="di_success != null" >
+        #{di_success,jdbcType=INTEGER},
+      </if>
+      <if test="di_man != null" >
+        #{di_man,jdbcType=VARCHAR},
+      </if>
+      <if test="di_toformal != null" >
+        #{di_toformal,jdbcType=INTEGER},
+      </if>
+    </trim>
+  </insert>
+
+  <update id="updateErr" >
+  update data_import
+  set
+  di_result = #{err},
+  di_success = 0,
+  where di_id = #{id}
+</update>
+
+<select id="selectDataById" resultMap="DetailMap">
+  select * from  data_importdetail
+  where dd_diid = #{id}
+</select>
+
+  <select id="selectProductBycode" resultMap="DetailMap">
+    select * from  data_importdetail
+    where dd_codevalue = #{code} and dd_diid=#{id} and ifnull(dd_success,0)=0 and dd_maindata is not null and companyid=#{companyid}
+  </select>
+
+  <update id="updateDataImport" parameterType="integer">
+    update data_import set di_toformal=1,di_success=1  where di_id=#{id}
+  </update>
+  <update id="updateDataImportError">
+    update data_import set di_toformal=1,di_result=#{err} where di_id=#{id}
+  </update>
+</mapper>

+ 4 - 0
applications/document/document-server/src/main/resources/mapper/ProductMapper.xml

@@ -901,5 +901,9 @@
     <delete id="deleteProdIODetailByCode">
         DELETE FROM PRODIODETAIL WHERE PD_PIID IN (SELECT PI_ID FROM PRODINOUT WHERE PI_INOUTNO=#{code} AND PRODINOUT.COMPANYID = #{companyId}) AND PRODIODETAIL.COMPANYID = #{companyId}
     </delete>
+
+    <select id="selectIdByCode" parameterType="long">
+        select pr_id from product where pr_code=#{code} and companyId=#{companyId}
+    </select>
 </mapper>
 

+ 3 - 0
applications/document/document-server/src/main/resources/mapper/WarehouseMapper.xml

@@ -370,5 +370,8 @@
     <select id="deleteCheckProdIO" resultType="int">
         SELECT COUNT(*) FROM PRODIODETAIL WHERE pd_whid = #{id} and companyid = #{companyId}
     </select>
+    <select id="selectWareHouse" resultMap="WarehouseResultMapper">
+        select * from warehouse where wh_code=#{code} and companyId=#{companyId}
+    </select>
 </mapper>
 

+ 4 - 0
applications/purchase/purchase-dto/src/main/java/com/usoftchina/saas/purchase/dto/PurchaseDTO.java

@@ -69,4 +69,8 @@ public class PurchaseDTO extends CommonBaseDTO implements Serializable{
 
     private Date pu_auditdate;
 
+    private Long pu_said;
+
+    private String pu_sacode;
+
 }

+ 5 - 2
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/controller/ProdInOutController.java

@@ -210,6 +210,9 @@ public class ProdInOutController {
         return prodInOutService.turnProdOut(id);
     }
 
-
-
+    @GetMapping("/homepageList")
+    public Result homepageList(PageRequest page, ListReqDTO req){
+        PageInfo pageInfo = prodInOutService.homepageList(page, req);
+         return Result.success(pageInfo);
+    }
 }

+ 1 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/mapper/ProdInOutListMapper.java

@@ -16,4 +16,5 @@ public interface ProdInOutListMapper {
     List<ProdInOutList> selectProdInOutBycondition(@Param("con") String con,@Param("companyId") Long companyId);
 
 
+    List<ProdInOutList> selectHomePageList(@Param("con") String con, @Param("companyId") Long companyId);
 }

+ 175 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/ProdHomePageList.java

@@ -0,0 +1,175 @@
+package com.usoftchina.saas.purchase.po;
+
+import com.usoftchina.saas.base.entity.CommonBaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author: guq
+ * @create: 2018-12-03 15:40
+ **/
+@Data
+public class ProdHomePageList extends CommonBaseEntity {
+    private String pi_inoutno;
+
+    private String pi_class;
+
+    private Date pi_date;
+
+    private Integer pi_vendid;
+
+    private String pi_vendcode;
+
+    private String pi_vendname;
+
+    private Integer pi_custid;
+
+    private String pi_custcode;
+
+    private String pi_custname;
+
+    private Integer pi_puid;
+
+    private String pi_pucode;
+
+    private Integer pi_said;
+
+    private String pi_sacode;
+
+    private Double pi_total;
+
+    private String pi_status;
+
+    private String pi_statuscode;
+
+    private String pi_printstatus;
+
+    private String pi_printstatuscode;
+
+    private String pi_text1;
+
+    private String pi_text2;
+
+    private String pi_text3;
+
+    private String pi_text4;
+
+    private String pi_text5;
+
+    private String pi_address;
+
+    private Date pi_auditdate;
+
+    private String pi_auditman;
+
+    private String pi_remark;
+
+    private Long pd_piid;
+
+    private String pd_inoutno;
+
+    private String pd_piclass;
+
+    private Integer pd_pdno;
+
+    private String pd_ordercode;
+
+    private Integer pd_orderdetno;
+
+    private Integer pd_prodid;
+
+    private String pd_prodcode;
+
+    private String pd_unit;
+
+    private Double pd_inqty;
+
+    private Double pd_outqty;
+
+    private Double pd_orderprice;
+
+    private Double pd_sendprice;
+
+    private Double pd_price;
+
+    private Double pd_total;
+
+    private Double pd_taxrate;
+
+    private Double pd_netprice;
+
+    private Double pd_nettotal;
+
+    private Integer pd_whid;
+
+    private String pd_whcode;
+
+    private String pd_whname;
+
+    private Integer pd_inwhid;
+
+    private String pd_inwhcode;
+
+    private String pd_inwhname;
+
+    private Integer pd_orderid;
+
+    private Integer pd_sdid;
+
+    private Integer pd_status;
+
+    private String pd_text1;
+
+    private String pd_text2;
+
+    private String pd_text3;
+
+    private String pd_text4;
+
+    private String pd_text5;
+
+    private Integer pd_ym;
+
+    private Double pd_yqty;
+
+    private String pd_remark;
+
+    private Long pd_ioid;
+
+    private String pi_iocode;
+
+    private String pi_prstatus;
+
+    private String pi_prstatuscode;
+
+    //数量字段一致
+    private Double qty;
+
+    //private ProductDTO productDTO;
+    private Long pr_id;
+    private String pr_code;
+    private String pr_detail;
+    private String pr_spec;
+    private String pr_unit;
+    private String pr_kind;
+    private String pr_orispeccode;
+    private long pr_whid;
+    private String pr_whcode;
+    private String pr_whname;
+    private long pr_zxbzs;
+    private long pr_leadtime;
+    private String pr_brand;
+    private String pr_standardprice;
+    private String pr_purcprice;
+    private String pr_saleprice;
+    private long pr_vendid;
+    private String pr_vendname;
+    private String pr_vendcode;
+    private String pr_status;
+    private String pr_statuscode;
+    private String pr_text1;
+    private String pr_text2;
+    private String pr_text3;
+    private String pr_text4;
+}

+ 4 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/Purchase.java

@@ -63,4 +63,8 @@ public class Purchase extends CommonBaseEntity implements Serializable {
 
     private Date pu_auditdate;
 
+    private Long pu_said;
+
+    private String pu_sacode;
+
 }

+ 4 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/po/PurchaseList.java

@@ -71,6 +71,10 @@ public class PurchaseList extends CommonBaseEntity implements Serializable {
 
     private String pu_auditman;
 
+    private Long pu_said;
+
+    private String pu_sacode;
+
     //从表字段
     private Long pd_id;
 

+ 2 - 0
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/ProdInOutService.java

@@ -83,4 +83,6 @@ public interface ProdInOutService extends CommonBaseService<ProdInOutMapper, Pro
     String getMaxnumber(BillCodeSeq bill);
 
     void getDefaultWarehouseByProduct(Long pi_id);
+
+    PageInfo homepageList(PageRequest page, ListReqDTO req);
 }

+ 19 - 12
applications/purchase/purchase-server/src/main/java/com/usoftchina/saas/purchase/service/impl/ProdInOutServiceImpl.java

@@ -18,6 +18,7 @@ import com.usoftchina.saas.context.BaseContextHolder;
 import com.usoftchina.saas.document.api.WarehouseApi;
 import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.exception.ExceptionCode;
+import com.usoftchina.saas.page.PageDefault;
 import com.usoftchina.saas.page.PageRequest;
 import com.usoftchina.saas.purchase.dto.ProdIODetailDTO;
 import com.usoftchina.saas.purchase.dto.ProdInOutDTO;
@@ -60,6 +61,20 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
     @Autowired
     private CommonService commonService;
 
+    @Override
+    public PageInfo homepageList(@PageDefault(size = 10) PageRequest page, ListReqDTO req) {
+        PageHelper.startPage(page.getNumber(), page.getSize());
+        List<ProdInOutList> lists = null;
+        Long companyId = BaseContextHolder.getCompanyId();
+        String con = req.getFinalCondition();
+        if (null == con) {
+            con = "1=1";
+        }
+        lists = prodInOutListMapper.selectHomePageList(con,companyId);
+        //取分页信息
+        PageInfo<ProdInOutList> pageInfo = new PageInfo<ProdInOutList>(lists);
+        return pageInfo;
+    }
 
     @Override
     public PageInfo<ProdInOutList> getListData(PageRequest page, ListReqDTO req) {
@@ -133,7 +148,6 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         String pi_inoutno = main.getPi_inoutno();
         String pi_class = main.getPi_class();
         ProdInOut prodInOut = BeanMapper.map(main,ProdInOut.class);
-
         //编号获取
         DocBaseDTO baseDTO = new DocBaseDTO();
         baseDTO.setCode(pi_inoutno);
@@ -141,17 +155,8 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         baseDTO.setName(pi_class);
         pi_inoutno = pushMaxnubmer(baseDTO);
         prodInOut.setPi_inoutno(pi_inoutno);
-
-
-        if ("采购验收单".equals(pi_class)){
-            prodInOut.setPi_prstatus(Status.PAYNONE.getDisplay());
-            prodInOut.setPi_prstatuscode(Status.PAYNONE.name());
-        }else if ("采购验退单".equals(pi_class)){
-            prodInOut.setPi_prstatus(Status.RECNONE.getDisplay());
-            prodInOut.setPi_prstatuscode(Status.RECNONE.name());
-        }
-
-
+        prodInOut.setPi_prstatus(Status.PAYNONE.getDisplay());
+        prodInOut.setPi_prstatuscode(Status.PAYNONE.name());
         //判断更新与保存动作
         if (StringUtils.isEmpty(pi_id) || "0".equals(pi_id.toString())){
             prodInOut.setCompanyId(companyId);
@@ -603,6 +608,8 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
     }
 
 
+
+
     private ProdInOut checkAndReturnOrder (Long id){
         if(id == null || id <= 0) {
             throw new BizException(BizExceptionCode.ILLEGAL_ID);

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

@@ -555,6 +555,8 @@ public class PurchaseServiceImpl extends CommonBaseServiceImpl<PurchaseMapper, P
         //setUpdateInfo(purchase);
         //更新存在字段
         purchaseMapper.updateByPrimaryKeySelective(purchase);
+        commonService.commonResAudit("purchase", "pu_id=" + id, "pu_status",
+                "pu_statuscode", "pu_auditdate", "pu_auditman");
         DocBaseDTO docBaseDTO = getBaseDTOById(id);
         //日志
         messageLogService.unAudit(docBaseDTO);

+ 117 - 4
applications/purchase/purchase-server/src/main/resources/mapper/ProdInOutListMapper.xml

@@ -101,6 +101,107 @@
     <result column="pr_text4" property="pr_text4"/>
   </resultMap>
 
+  <resultMap id="homePageList" type="com.usoftchina.saas.purchase.po.ProdHomePageList">
+    <id column="pi_id" jdbcType="INTEGER" property="id" />
+    <result column="pi_inoutno" jdbcType="VARCHAR" property="pi_inoutno" />
+    <result column="pi_class" jdbcType="VARCHAR" property="pi_class" />
+    <result column="pi_date" jdbcType="TIMESTAMP" property="pi_date" />
+    <result column="pi_vendid" jdbcType="INTEGER" property="pi_vendid" />
+    <result column="pi_vendcode" jdbcType="VARCHAR" property="pi_vendcode" />
+    <result column="pi_vendname" jdbcType="VARCHAR" property="pi_vendname" />
+    <result column="pi_custid" jdbcType="INTEGER" property="pi_custid" />
+    <result column="pi_custcode" jdbcType="VARCHAR" property="pi_custcode" />
+    <result column="pi_custname" jdbcType="VARCHAR" property="pi_custname" />
+    <result column="pi_puid" jdbcType="INTEGER" property="pi_puid" />
+    <result column="pi_pucode" jdbcType="VARCHAR" property="pi_pucode" />
+    <result column="pi_said" jdbcType="INTEGER" property="pi_said" />
+    <result column="pi_sacode" jdbcType="VARCHAR" property="pi_sacode" />
+    <result column="pi_total" jdbcType="DOUBLE" property="pi_total" />
+    <result column="pi_status" jdbcType="VARCHAR" property="pi_status" />
+    <result column="pi_statuscode" jdbcType="VARCHAR" property="pi_statuscode" />
+    <result column="pi_printstatus" jdbcType="VARCHAR" property="pi_printstatus" />
+    <result column="pi_printstatuscode" jdbcType="VARCHAR" property="pi_printstatuscode" />
+    <result column="pi_text1" jdbcType="VARCHAR" property="pi_text1" />
+    <result column="pi_text2" jdbcType="VARCHAR" property="pi_text2" />
+    <result column="pi_text3" jdbcType="VARCHAR" property="pi_text3" />
+    <result column="pi_text4" jdbcType="VARCHAR" property="pi_text4" />
+    <result column="pi_text5" jdbcType="VARCHAR" property="pi_text5" />
+    <result column="pi_auditdate" jdbcType="TIMESTAMP" property="pi_auditdate" />
+    <result column="pi_auditman" jdbcType="VARCHAR" property="pi_auditman" />
+    <result column="pi_address" jdbcType="VARCHAR" property="pi_address" />
+    <result column="pi_remark" jdbcType="VARCHAR" property="pi_remark" />
+    <result column="pd_piid" jdbcType="INTEGER" property="pd_piid" />
+    <result column="pd_inoutno" jdbcType="VARCHAR" property="pd_inoutno" />
+    <result column="pd_piclass" jdbcType="VARCHAR" property="pd_piclass" />
+    <result column="pd_pdno" jdbcType="INTEGER" property="pd_pdno" />
+    <result column="pd_ordercode" jdbcType="VARCHAR" property="pd_ordercode" />
+    <result column="pd_orderdetno" jdbcType="INTEGER" property="pd_orderdetno" />
+    <result column="pd_prodid" jdbcType="INTEGER" property="pd_prodid" />
+    <result column="pd_prodcode" jdbcType="VARCHAR" property="pd_prodcode" />
+    <result column="pd_unit" jdbcType="VARCHAR" property="pd_unit" />
+    <result column="pd_inqty" jdbcType="DOUBLE" property="pd_inqty" />
+    <result column="pd_outqty" jdbcType="DOUBLE" property="pd_outqty" />
+    <result column="pd_orderprice" jdbcType="DOUBLE" property="pd_orderprice" />
+    <result column="pd_sendprice" jdbcType="DOUBLE" property="pd_sendprice" />
+    <result column="pd_price" jdbcType="DOUBLE" property="pd_price" />
+    <result column="pd_total" jdbcType="DOUBLE" property="pd_total" />
+    <result column="pd_taxrate" jdbcType="DOUBLE" property="pd_taxrate" />
+    <result column="pd_netprice" jdbcType="DOUBLE" property="pd_netprice" />
+    <result column="pd_nettotal" jdbcType="DOUBLE" property="pd_nettotal" />
+    <result column="pd_whid" jdbcType="INTEGER" property="pd_whid" />
+    <result column="pd_whcode" jdbcType="VARCHAR" property="pd_whcode" />
+    <result column="pd_whname" jdbcType="VARCHAR" property="pd_whname" />
+    <result column="pd_inwhid" jdbcType="INTEGER" property="pd_inwhid" />
+    <result column="pd_inwhcode" jdbcType="VARCHAR" property="pd_inwhcode" />
+    <result column="pd_inwhname" jdbcType="VARCHAR" property="pd_inwhname" />
+    <result column="pd_orderid" jdbcType="INTEGER" property="pd_orderid" />
+    <result column="pd_sdid" jdbcType="INTEGER" property="pd_sdid" />
+    <result column="pd_status" jdbcType="INTEGER" property="pd_status" />
+    <result column="companyid" property="companyId" jdbcType="BIGINT" />
+    <result column="updaterId" property="updaterId" jdbcType="INTEGER" />
+    <result column="updaterName" jdbcType="VARCHAR" property="updaterName" />
+    <result column="updateTime" property="updateTime" jdbcType="TIMESTAMP" />
+    <result column="creatorId" property="creatorId" jdbcType="INTEGER"/>
+    <result column="creatorName" jdbcType="VARCHAR" property="creatorName" />
+    <result column="createTime" property="createTime" jdbcType="TIMESTAMP" />
+    <result column="pd_text1" jdbcType="VARCHAR" property="pd_text1" />
+    <result column="pd_text2" jdbcType="VARCHAR" property="pd_text2" />
+    <result column="pd_text3" jdbcType="VARCHAR" property="pd_text3" />
+    <result column="pd_text4" jdbcType="VARCHAR" property="pd_text4" />
+    <result column="pd_text5" jdbcType="VARCHAR" property="pd_text5" />
+    <result column="pd_ym" jdbcType="INTEGER" property="pd_ym" />
+    <result column="pd_yqty" jdbcType="DOUBLE" property="pd_yqty" />
+    <result column="pd_ioid" jdbcType="INTEGER" property="pd_ioid" />
+    <result column="pi_iocode" jdbcType="VARCHAR" property="pi_iocode" />
+    <result column="pd_remark" jdbcType="VARCHAR" property="pd_remark" />
+    <result column="pr_id" property="pr_id"/>
+    <result column="pr_code" property="pr_code"/>
+    <result column="pr_detail" property="pr_detail"/>
+    <result column="pr_spec" property="pr_spec"/>
+    <result column="pr_unit" property="pr_unit"/>
+    <result column="pr_kind" property="pr_kind"/>
+    <result column="pr_orispeccode" property="pr_orispeccode"/>
+    <result column="pr_whid" property="pr_whid"/>
+    <result column="pr_whcode" property="pr_whcode"/>
+    <result column="pr_whname" property="pr_whname"/>
+    <result column="pr_zxbzs" property="pr_zxbzs"/>
+    <result column="pr_leadtime" property="pr_leadtime"/>
+    <result column="pr_brand" property="pr_brand"/>
+    <result column="pr_standardprice" property="pr_standardprice"/>
+    <result column="pr_purcprice" property="pr_purcprice"/>
+    <result column="pr_saleprice" property="pr_saleprice"/>
+    <result column="pr_vendid" property="pr_vendid"/>
+    <result column="pr_vendname" property="pr_vendname"/>
+    <result column="pr_vendcode" property="pr_vendcode"/>
+    <result column="pr_status" property="pr_status"/>
+    <result column="pr_statuscode" property="pr_statuscode"/>
+    <result column="pr_text1" property="pr_text1"/>
+    <result column="pr_text2" property="pr_text2"/>
+    <result column="pr_text3" property="pr_text3"/>
+    <result column="pr_text4" property="pr_text4"/>
+    <result column="qty" property="qty"/>
+  </resultMap>
+
   <select id="selectProdInOutBycondition"  resultMap="BaseResultMap">
     select  *  from prodinout
     <where>
@@ -113,6 +214,22 @@
     </where>  order by pi_id desc
   </select>
 
+  <select id="selectHomePageList" resultMap="homePageList">
+    select  *,
+    case WHEN pi_class='采购验收单' then pd_inqty when pi_class='采购验退单' then pd_outqty else 0 end qty
+    from prodinout left join prodiodetail on pi_id = pd_piid left join vendor on pi_vendid=ve_id
+    left join product on pd_prodid=pr_id
+    <where>
+      <if test="con != null">
+        ${con}
+      </if>
+      <if test="companyId != null">
+        and  prodinout.companyid = #{companyId}
+      </if>
+    </where>
+    order by pi_id desc,pd_pdno desc
+  </select>
+
   <select id="selectProdInOutListByCondition"  resultMap="BaseResultMap">
     select  *  from prodinout left join prodiodetail on pi_id = pd_piid left join vendor on pi_vendid=ve_id
     left join product on pd_prodid=pr_id
@@ -126,8 +243,4 @@
     </where>
     order by pi_id desc,pd_pdno desc
   </select>
-
-
-
-
 </mapper>

+ 2 - 0
applications/purchase/purchase-server/src/main/resources/mapper/PurchaseListMapper.xml

@@ -34,6 +34,8 @@
         <result column="pu_text3" property="pu_text3" jdbcType="VARCHAR" />
         <result column="pu_text4" property="pu_text4" jdbcType="VARCHAR" />
         <result column="pu_text5" property="pu_text5" jdbcType="VARCHAR" />
+        <result column="pu_said" property="pu_said" jdbcType="INTEGER" />
+        <result column="pu_sacode" property="pu_sacode" jdbcType="VARCHAR" />
         <result column="PD_ID" property="pd_id" jdbcType="INTEGER" />
         <result column="PD_PUID" property="pd_puid" jdbcType="INTEGER" />
         <result column="PD_CODE" property="pd_code" jdbcType="VARCHAR" />

+ 3 - 0
applications/sale/sale-dto/src/main/java/com/usoftchina/saas/sale/dto/PurchaseDTO.java

@@ -63,4 +63,7 @@ public class PurchaseDTO extends CommonBaseEntity implements Serializable {
 
     private Date pu_auditdate;
 
+    private Long pu_said;
+
+    private String pu_sacode;
 }

+ 4 - 0
applications/sale/sale-dto/src/main/java/com/usoftchina/saas/sale/dto/PurchaseListDTO.java

@@ -71,6 +71,10 @@ public class PurchaseListDTO extends CommonBaseEntity implements Serializable {
 
     private String pu_auditman;
 
+    private Long pu_said;
+
+    private String pu_sacode;
+
     //从表字段
     private Long pd_id;
 

+ 7 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/controller/ProdInOutController.java

@@ -39,6 +39,13 @@ public class ProdInOutController {
         return Result.success(listData);
     }
 
+    @GetMapping("/homepageList")
+    public Result homepageList(PageRequest page, ListReqDTO req){
+        PageInfo pageInfo = prodInOutService.homepageList(page, req);
+        return Result.success(pageInfo);
+    }
+
+
     /**
      * 获取出入库单表单
      *

+ 1 - 1
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/mapper/ProdInOutListMapper.java

@@ -16,5 +16,5 @@ public interface ProdInOutListMapper {
 
     List<ProdInOutList> selectProdInOutBycondition(@Param("con") String con, @Param("companyId") Long companyId);
 
-
+    List<ProdInOutList> selectHomePageList(@Param("con") String con, @Param("companyId") Long companyId);
 }

+ 175 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/po/ProdHomePageList.java

@@ -0,0 +1,175 @@
+package com.usoftchina.saas.sale.po;
+
+import com.usoftchina.saas.base.entity.CommonBaseEntity;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author: guq
+ * @create: 2018-12-03 15:40
+ **/
+@Data
+public class ProdHomePageList extends CommonBaseEntity {
+    private String pi_inoutno;
+
+    private String pi_class;
+
+    private Date pi_date;
+
+    private Integer pi_vendid;
+
+    private String pi_vendcode;
+
+    private String pi_vendname;
+
+    private Integer pi_custid;
+
+    private String pi_custcode;
+
+    private String pi_custname;
+
+    private Integer pi_puid;
+
+    private String pi_pucode;
+
+    private Integer pi_said;
+
+    private String pi_sacode;
+
+    private Double pi_total;
+
+    private String pi_status;
+
+    private String pi_statuscode;
+
+    private String pi_printstatus;
+
+    private String pi_printstatuscode;
+
+    private String pi_text1;
+
+    private String pi_text2;
+
+    private String pi_text3;
+
+    private String pi_text4;
+
+    private String pi_text5;
+
+    private String pi_address;
+
+    private Date pi_auditdate;
+
+    private String pi_auditman;
+
+    private String pi_remark;
+
+    private Long pd_piid;
+
+    private String pd_inoutno;
+
+    private String pd_piclass;
+
+    private Integer pd_pdno;
+
+    private String pd_ordercode;
+
+    private Integer pd_orderdetno;
+
+    private Integer pd_prodid;
+
+    private String pd_prodcode;
+
+    private String pd_unit;
+
+    private Double pd_inqty;
+
+    private Double pd_outqty;
+
+    private Double pd_orderprice;
+
+    private Double pd_sendprice;
+
+    private Double pd_price;
+
+    private Double pd_total;
+
+    private Double pd_taxrate;
+
+    private Double pd_netprice;
+
+    private Double pd_nettotal;
+
+    private Integer pd_whid;
+
+    private String pd_whcode;
+
+    private String pd_whname;
+
+    private Integer pd_inwhid;
+
+    private String pd_inwhcode;
+
+    private String pd_inwhname;
+
+    private Integer pd_orderid;
+
+    private Integer pd_sdid;
+
+    private Integer pd_status;
+
+    private String pd_text1;
+
+    private String pd_text2;
+
+    private String pd_text3;
+
+    private String pd_text4;
+
+    private String pd_text5;
+
+    private Integer pd_ym;
+
+    private Double pd_yqty;
+
+    private String pd_remark;
+
+    private Long pd_ioid;
+
+    private String pi_iocode;
+
+    private String pi_prstatus;
+
+    private String pi_prstatuscode;
+
+    //数量字段一致
+    private Double qty;
+
+    //private ProductDTO productDTO;
+    private Long pr_id;
+    private String pr_code;
+    private String pr_detail;
+    private String pr_spec;
+    private String pr_unit;
+    private String pr_kind;
+    private String pr_orispeccode;
+    private long pr_whid;
+    private String pr_whcode;
+    private String pr_whname;
+    private long pr_zxbzs;
+    private long pr_leadtime;
+    private String pr_brand;
+    private String pr_standardprice;
+    private String pr_purcprice;
+    private String pr_saleprice;
+    private long pr_vendid;
+    private String pr_vendname;
+    private String pr_vendcode;
+    private String pr_status;
+    private String pr_statuscode;
+    private String pr_text1;
+    private String pr_text2;
+    private String pr_text3;
+    private String pr_text4;
+}

+ 2 - 3
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/ProdInOutService.java

@@ -1,17 +1,14 @@
 package com.usoftchina.saas.sale.service;
 
 import com.github.pagehelper.PageInfo;
-import com.usoftchina.saas.base.Result;
 import com.usoftchina.saas.base.service.CommonBaseService;
 import com.usoftchina.saas.commons.dto.BatchDealBaseDTO;
 import com.usoftchina.saas.commons.dto.DocBaseDTO;
-import com.usoftchina.saas.commons.dto.DocSavedDTO;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
 import com.usoftchina.saas.commons.po.BillCodeSeq;
 import com.usoftchina.saas.page.PageRequest;
 
 import com.usoftchina.saas.sale.dto.ProdInOutFormDTO;
-import com.usoftchina.saas.sale.dto.ProdInOutReqDTO;
 import com.usoftchina.saas.sale.mapper.ProdInOutMapper;
 import com.usoftchina.saas.storage.po.ProdInOut;
 import com.usoftchina.saas.storage.po.ProdInOutList;
@@ -122,4 +119,6 @@ public interface ProdInOutService extends CommonBaseService<ProdInOutMapper, Pro
     DocBaseDTO turnProdin(Long id);
 
     String getMaxnumber(BillCodeSeq bill);
+
+    PageInfo homepageList(PageRequest page, ListReqDTO req);
 }

+ 15 - 0
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/ProdInOutServiceImpl.java

@@ -362,6 +362,21 @@ public class ProdInOutServiceImpl extends CommonBaseServiceImpl<ProdInOutMapper,
         return pageInfo;
     }
 
+    @Override
+    public PageInfo homepageList(@PageDefault(size = 10) PageRequest page, ListReqDTO req) {
+        PageHelper.startPage(page.getNumber(), page.getSize());
+        List<ProdInOutList> lists = null;
+        Long companyId = BaseContextHolder.getCompanyId();
+        String con = req.getFinalCondition();
+        if (null == con) {
+            con = "1=1";
+        }
+        lists = prodInOutListMapper.selectHomePageList(con,companyId);
+        //取分页信息
+        PageInfo<ProdInOutList> pageInfo = new PageInfo<ProdInOutList>(lists);
+        return pageInfo;
+    }
+
     private List<ProdInOutList> getListByMode(ListReqDTO req) {
         List<ProdInOutList> list = null;
         Long companyId = BaseContextHolder.getCompanyId();

+ 3 - 5
applications/sale/sale-server/src/main/java/com/usoftchina/saas/sale/service/impl/SaleServiceImpl.java

@@ -2,8 +2,6 @@ package com.usoftchina.saas.sale.service.impl;
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
-import com.usoftchina.saas.base.Result;
-import com.usoftchina.saas.base.service.CommonBaseServiceImpl;
 import com.usoftchina.saas.commons.api.CommonService;
 import com.usoftchina.saas.commons.api.MaxnumberService;
 import com.usoftchina.saas.commons.api.MessageLogService;
@@ -15,7 +13,6 @@ import com.usoftchina.saas.commons.po.BillCodeSeq;
 import com.usoftchina.saas.commons.po.Operation;
 import com.usoftchina.saas.commons.po.Status;
 import com.usoftchina.saas.context.BaseContextHolder;
-import com.usoftchina.saas.document.entities.Product;
 import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.page.PageDefault;
 import com.usoftchina.saas.page.PageRequest;
@@ -30,7 +27,6 @@ import com.usoftchina.saas.sale.service.SaleService;
 import com.usoftchina.saas.storage.po.ProdIODetail;
 import com.usoftchina.saas.storage.po.ProdInOut;
 import com.usoftchina.saas.utils.BeanMapper;
-import io.swagger.models.auth.In;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -581,12 +577,14 @@ public class SaleServiceImpl implements SaleService{
         purchase.setPu_code(result);
         purchase.setPu_status(Status.UNAUDITED.getDisplay());
         purchase.setPu_statuscode(Status.UNAUDITED.toString());
+        purchase.setPu_date(new Date());
+        purchase.setPu_said(sale.getId());
+        purchase.setPu_sacode(sale.getSa_code());
         purchase.setCompanyId(BaseContextHolder.getCompanyId());
         purchase.setCreatorId(BaseContextHolder.getUserId());
         purchase.setCreateTime(new Date());
         purchase.setCreatorName(BaseContextHolder.getUserName());
         saleMapper.turnPurchase(purchase);
-
         Long purchaseId = purchase.getId();
         for (SaleList detail : dateilList){
             PurchaseDetailDTO purchaseDetail = new PurchaseDetailDTO();

+ 117 - 0
applications/sale/sale-server/src/main/resources/mapper/ProdInOutListMapper.xml

@@ -74,6 +74,107 @@
     <result column="pd_ordertotal" jdbcType="DOUBLE" property="pd_ordertotal" />
   </resultMap>
 
+  <resultMap id="homePageList" type="com.usoftchina.saas.sale.po.ProdHomePageList">
+    <id column="pi_id" jdbcType="INTEGER" property="id" />
+    <result column="pi_inoutno" jdbcType="VARCHAR" property="pi_inoutno" />
+    <result column="pi_class" jdbcType="VARCHAR" property="pi_class" />
+    <result column="pi_date" jdbcType="TIMESTAMP" property="pi_date" />
+    <result column="pi_vendid" jdbcType="INTEGER" property="pi_vendid" />
+    <result column="pi_vendcode" jdbcType="VARCHAR" property="pi_vendcode" />
+    <result column="pi_vendname" jdbcType="VARCHAR" property="pi_vendname" />
+    <result column="pi_custid" jdbcType="INTEGER" property="pi_custid" />
+    <result column="pi_custcode" jdbcType="VARCHAR" property="pi_custcode" />
+    <result column="pi_custname" jdbcType="VARCHAR" property="pi_custname" />
+    <result column="pi_puid" jdbcType="INTEGER" property="pi_puid" />
+    <result column="pi_pucode" jdbcType="VARCHAR" property="pi_pucode" />
+    <result column="pi_said" jdbcType="INTEGER" property="pi_said" />
+    <result column="pi_sacode" jdbcType="VARCHAR" property="pi_sacode" />
+    <result column="pi_total" jdbcType="DOUBLE" property="pi_total" />
+    <result column="pi_status" jdbcType="VARCHAR" property="pi_status" />
+    <result column="pi_statuscode" jdbcType="VARCHAR" property="pi_statuscode" />
+    <result column="pi_printstatus" jdbcType="VARCHAR" property="pi_printstatus" />
+    <result column="pi_printstatuscode" jdbcType="VARCHAR" property="pi_printstatuscode" />
+    <result column="pi_text1" jdbcType="VARCHAR" property="pi_text1" />
+    <result column="pi_text2" jdbcType="VARCHAR" property="pi_text2" />
+    <result column="pi_text3" jdbcType="VARCHAR" property="pi_text3" />
+    <result column="pi_text4" jdbcType="VARCHAR" property="pi_text4" />
+    <result column="pi_text5" jdbcType="VARCHAR" property="pi_text5" />
+    <result column="pi_auditdate" jdbcType="TIMESTAMP" property="pi_auditdate" />
+    <result column="pi_auditman" jdbcType="VARCHAR" property="pi_auditman" />
+    <result column="pi_address" jdbcType="VARCHAR" property="pi_address" />
+    <result column="pi_remark" jdbcType="VARCHAR" property="pi_remark" />
+    <result column="pd_piid" jdbcType="INTEGER" property="pd_piid" />
+    <result column="pd_inoutno" jdbcType="VARCHAR" property="pd_inoutno" />
+    <result column="pd_piclass" jdbcType="VARCHAR" property="pd_piclass" />
+    <result column="pd_pdno" jdbcType="INTEGER" property="pd_pdno" />
+    <result column="pd_ordercode" jdbcType="VARCHAR" property="pd_ordercode" />
+    <result column="pd_orderdetno" jdbcType="INTEGER" property="pd_orderdetno" />
+    <result column="pd_prodid" jdbcType="INTEGER" property="pd_prodid" />
+    <result column="pd_prodcode" jdbcType="VARCHAR" property="pd_prodcode" />
+    <result column="pd_unit" jdbcType="VARCHAR" property="pd_unit" />
+    <result column="pd_inqty" jdbcType="DOUBLE" property="pd_inqty" />
+    <result column="pd_outqty" jdbcType="DOUBLE" property="pd_outqty" />
+    <result column="pd_orderprice" jdbcType="DOUBLE" property="pd_orderprice" />
+    <result column="pd_sendprice" jdbcType="DOUBLE" property="pd_sendprice" />
+    <result column="pd_price" jdbcType="DOUBLE" property="pd_price" />
+    <result column="pd_total" jdbcType="DOUBLE" property="pd_total" />
+    <result column="pd_taxrate" jdbcType="DOUBLE" property="pd_taxrate" />
+    <result column="pd_netprice" jdbcType="DOUBLE" property="pd_netprice" />
+    <result column="pd_nettotal" jdbcType="DOUBLE" property="pd_nettotal" />
+    <result column="pd_whid" jdbcType="INTEGER" property="pd_whid" />
+    <result column="pd_whcode" jdbcType="VARCHAR" property="pd_whcode" />
+    <result column="pd_whname" jdbcType="VARCHAR" property="pd_whname" />
+    <result column="pd_inwhid" jdbcType="INTEGER" property="pd_inwhid" />
+    <result column="pd_inwhcode" jdbcType="VARCHAR" property="pd_inwhcode" />
+    <result column="pd_inwhname" jdbcType="VARCHAR" property="pd_inwhname" />
+    <result column="pd_orderid" jdbcType="INTEGER" property="pd_orderid" />
+    <result column="pd_sdid" jdbcType="INTEGER" property="pd_sdid" />
+    <result column="pd_status" jdbcType="INTEGER" property="pd_status" />
+    <result column="companyid" property="companyId" jdbcType="BIGINT" />
+    <result column="updaterId" property="updaterId" jdbcType="INTEGER" />
+    <result column="updaterName" jdbcType="VARCHAR" property="updaterName" />
+    <result column="updateTime" property="updateTime" jdbcType="TIMESTAMP" />
+    <result column="creatorId" property="creatorId" jdbcType="INTEGER"/>
+    <result column="creatorName" jdbcType="VARCHAR" property="creatorName" />
+    <result column="createTime" property="createTime" jdbcType="TIMESTAMP" />
+    <result column="pd_text1" jdbcType="VARCHAR" property="pd_text1" />
+    <result column="pd_text2" jdbcType="VARCHAR" property="pd_text2" />
+    <result column="pd_text3" jdbcType="VARCHAR" property="pd_text3" />
+    <result column="pd_text4" jdbcType="VARCHAR" property="pd_text4" />
+    <result column="pd_text5" jdbcType="VARCHAR" property="pd_text5" />
+    <result column="pd_ym" jdbcType="INTEGER" property="pd_ym" />
+    <result column="pd_yqty" jdbcType="DOUBLE" property="pd_yqty" />
+    <result column="pd_ioid" jdbcType="INTEGER" property="pd_ioid" />
+    <result column="pi_iocode" jdbcType="VARCHAR" property="pi_iocode" />
+    <result column="pd_remark" jdbcType="VARCHAR" property="pd_remark" />
+    <result column="pr_id" property="pr_id"/>
+    <result column="pr_code" property="pr_code"/>
+    <result column="pr_detail" property="pr_detail"/>
+    <result column="pr_spec" property="pr_spec"/>
+    <result column="pr_unit" property="pr_unit"/>
+    <result column="pr_kind" property="pr_kind"/>
+    <result column="pr_orispeccode" property="pr_orispeccode"/>
+    <result column="pr_whid" property="pr_whid"/>
+    <result column="pr_whcode" property="pr_whcode"/>
+    <result column="pr_whname" property="pr_whname"/>
+    <result column="pr_zxbzs" property="pr_zxbzs"/>
+    <result column="pr_leadtime" property="pr_leadtime"/>
+    <result column="pr_brand" property="pr_brand"/>
+    <result column="pr_standardprice" property="pr_standardprice"/>
+    <result column="pr_purcprice" property="pr_purcprice"/>
+    <result column="pr_saleprice" property="pr_saleprice"/>
+    <result column="pr_vendid" property="pr_vendid"/>
+    <result column="pr_vendname" property="pr_vendname"/>
+    <result column="pr_vendcode" property="pr_vendcode"/>
+    <result column="pr_status" property="pr_status"/>
+    <result column="pr_statuscode" property="pr_statuscode"/>
+    <result column="pr_text1" property="pr_text1"/>
+    <result column="pr_text2" property="pr_text2"/>
+    <result column="pr_text3" property="pr_text3"/>
+    <result column="pr_text4" property="pr_text4"/>
+    <result column="qty" property="qty"/>
+  </resultMap>
+
 
   <select id="selectProdInOutListByCondition" resultMap="BaseResultMap">
     select  *  from prodinout
@@ -101,4 +202,20 @@
       order by pi_id desc
   </select>
 
+  <select id="selectHomePageList" resultMap="homePageList">
+    select  *,
+    case WHEN pi_class='出货单' then pd_outqty when pi_class='销售退货单' then pd_inqty else 0 end qty
+    from prodinout left join prodiodetail on pi_id = pd_piid left join product on pr_id = pd_prodid
+    left join customer on pi_custid=cu_id
+    <where>
+      <if test="con != null">
+        ${con}
+      </if>
+      <if test="companyId != null">
+        and  prodinout.companyId = #{companyId}
+      </if>
+    </where>
+    order by pi_id desc
+  </select>
+
 </mapper>

+ 12 - 0
applications/sale/sale-server/src/main/resources/mapper/SaleMapper.xml

@@ -508,6 +508,12 @@
       <if test="pu_shipaddresscode != null" >
         PU_SHIPADDRESSCODE,
       </if>
+      <if test="pu_said != null" >
+        pu_said,
+      </if>
+      <if test="pu_sacode != null" >
+        pu_sacode,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides="," >
       <if test="pu_code != null" >
@@ -606,6 +612,12 @@
       <if test="pu_shipaddresscode != null" >
         #{pu_shipaddresscode,jdbcType=LONGVARCHAR},
       </if>
+      <if test="pu_said != null" >
+        #{pu_said,jdbcType=INTEGER},
+      </if>
+      <if test="pu_sacode != null" >
+        #{pu_sacode,jdbcType=VARCHAR},
+      </if>
     </trim>
   </insert>
 

+ 12 - 1
base-servers/account/account-dto/src/main/java/com/usoftchina/saas/account/dto/CompanyRspDTO.java

@@ -45,6 +45,16 @@ public class CompanyRspDTO implements Serializable {
 
     private String adminEmail;
 
+    private String adminMobile;
+
+    public String getAdminMobile() {
+        return adminMobile;
+    }
+
+    public void setAdminMobile(String adminMobile) {
+        this.adminMobile = adminMobile;
+    }
+
     public String getAdminEmail() {
         return adminEmail;
     }
@@ -149,7 +159,7 @@ public class CompanyRspDTO implements Serializable {
         this.default_ = default_;
     }
 
-    public CompanyRspDTO(String name, String businessCode, String address, boolean default_, boolean saas_, String uu, String admin, Long adminId, String type) {
+    public CompanyRspDTO(String name, String businessCode, String address, boolean default_, boolean saas_, String uu, String admin, Long adminId, String type, String adminMobile) {
         this.name = name;
         this.businessCode = businessCode;
         this.address = address;
@@ -159,6 +169,7 @@ public class CompanyRspDTO implements Serializable {
         this.admin = admin;
         this.adminId = adminId;
         this.type = type;
+        this.adminMobile = adminMobile;
     }
 
     public CompanyRspDTO() {

+ 2 - 1
base-servers/account/account-server/src/main/java/com/usoftchina/saas/account/service/impl/AccountCenterServiceImpl.java

@@ -167,7 +167,8 @@ public class AccountCenterServiceImpl implements AccountCenterService {
                         ssoUserSpace.getSpaceUU()!=null ? ssoUserSpace.getSpaceUU().toString() : "0",
                         ssoUserSpace.getAdmin()!=null ? ssoUserSpace.getAdmin().getVipName() : null,
                         0L,
-                        ssoUserSpace.getProfession()
+                        ssoUserSpace.getProfession(),
+                        ssoUserSpace.getAdmin()!=null ? ssoUserSpace.getAdmin().getMobile() : null
                 );
                 resultList.add(companyRspDTO);
             }

+ 1 - 1
base-servers/account/account-server/src/main/resources/mapper/AccountCompanyMapper.xml

@@ -14,7 +14,7 @@
         delete from ac_account_company where company_id=#{companyId}
     </delete>
     <select id="getCompanyListByAccountMobile" resultType="com.usoftchina.saas.account.dto.CompanyRspDTO">
-        SELECT cmp.id,cmp.name,cmp.uu,cmp.business_code businessCode,cmp.address,accmp.is_default default_,'1' saas_,aci.realname admin,cmp.creator_id adminId,cmp.type,ac.email adminEmail from ac_company cmp
+        SELECT cmp.id,cmp.name,cmp.uu,cmp.business_code businessCode,cmp.address,accmp.is_default default_,'1' saas_,aci.realname admin,cmp.creator_id adminId,cmp.type,ac.email adminEmail,ac.mobile adminMobile from ac_company cmp
         left join ac_account_company accmp on accmp.company_id=cmp.id
         left join ac_account ac on ac.id = accmp.account_id
         left join ac_account aci on aci.id = cmp.creator_id

+ 1 - 11
base-servers/gateway-server/src/main/java/com/usoftchina/saas/gateway/config/AuthFilter.java

@@ -18,7 +18,6 @@ import com.usoftchina.saas.exception.ExceptionCode;
 import com.usoftchina.saas.gateway.error.PermissionException;
 import com.usoftchina.saas.gateway.util.AntPathRequestMatcher;
 import com.usoftchina.saas.utils.CollectionUtils;
-import com.usoftchina.saas.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.cloud.gateway.filter.GatewayFilterChain;
@@ -93,20 +92,11 @@ public class AuthFilter implements GlobalFilter, Ordered {
     private void checkPermission(ServerHttpRequest request, JwtInfo jwt, AccountDTO accountDTO) {
         if (!accountDTO.isAdmin(jwt.getCompanyId())) {
             // 非管理账户,需要鉴权
-            ResourceCache.current().hdel();
             List<UrlResourceDTO> resources = ResourceCache.current().getUrlResources();
             if (!CollectionUtils.isEmpty(resources)) {
                 // 本次请求相关的资源
                 List<UrlResourceDTO> permissions = resources.parallelStream().filter(resource -> {
-                    if (StringUtils.isEmpty(resource.getUrl())) {
-                        return false;
-                    }
-                    //处理删除、查询时 url变动无法匹配的问题
-                    String url = resource.getUrl();
-                    if (url.substring(url.length() - 1).equals("/")) {
-                        url += "*";
-                    }
-                    AntPathRequestMatcher matcher = new AntPathRequestMatcher(url, resource.getMethod());
+                    AntPathRequestMatcher matcher = new AntPathRequestMatcher(resource.getUrl(), resource.getMethod());
                     return matcher.matches(request);
                 }).collect(Collectors.toList());
                 if (!CollectionUtils.isEmpty(permissions)) {

+ 3 - 3
frontend/saas-web/app/Application.scss

@@ -54,9 +54,9 @@ body.launching {
   z-index: 0 !important;
 }
 
-.x-css-shadow {
-  box-shadow: none !important;
-}
+// .x-css-shadow {
+//   box-shadow: none !important;
+// }
 
 .shadow {
   @include box-shadow(rgba(0, 0, 0, 0.2) 0 1px 2px);

+ 95 - 6
frontend/saas-web/app/view/core/base/ImportWindow.js

@@ -76,7 +76,40 @@ Ext.define('saas.view.core.base.ImportWindow', {
         name:'over',
         text:'完成',
         handler:function(b){
-            b.ownerCt.ownerCt.close()
+            var form = b.ownerCt.ownerCt;
+            var id = form.importId;
+            if(id){
+                form.setLoading(true);
+                Ext.Ajax.request({
+                    url: '/api/document/'+form.ownerCt.caller.toLocaleLowerCase()+'/saveToFormal',//这里是填写需要跨域访问的URL
+                    method: 'post',
+                    headers: {
+                        'Access-Control-Allow-Origin': '*',
+                        'Authorization':  saas.util.State.get('session').token,
+                        "Content-Type": 'application/x-www-form-urlencoded;charset=UTF-8'
+                    },
+                    params:{
+                        id:id,
+                        update:false
+                    },
+                    success: function (response, opts) {
+                        form.setLoading(false);
+                        var res = Ext.decode(response.responseText);
+                        if(!res.success){
+                            saas.util.BaseUtil.showErrorToast('导入数据失败:' + res.message);
+                        }else{
+                            form.close();
+                        }
+                    },
+                    failure: function (response, opts) {
+                        form.setLoading(false);
+                        var res = Ext.decode(response.responseText);
+                        saas.util.BaseUtil.showErrorToast('导入数据失败: ' + res.message);
+                    }
+                });
+            }else{
+                form.close();
+            }
         }
     },{
         name:'close',
@@ -133,7 +166,7 @@ Ext.define('saas.view.core.base.ImportWindow', {
                         handler:function(b){
                             var caller = b.ownerCt.ownerCt.ownerCt.ownerCt.caller;
                             //获取模版
-                            window.location.href = 'http://192.168.253.58:8560/api/commons/excel/import/templet?caller='+caller;
+                            window.location.href = '/api/commons/excel/import/templet?caller='+caller;
                         }
                     }
                 },{
@@ -149,15 +182,71 @@ Ext.define('saas.view.core.base.ImportWindow', {
                 },{
                     hidden:true,
                     margin:'15px 0 0 0',
-                    width: 180,
                     labelWidth:100,
+                    allowBlank : true, 
+                    width:180,
                     buttonOnly:true,
                     fieldLabel:'上传文件',
-                    name:'upload',
                     xtype: 'filefield',
+                    name:'upload',
                     buttonText: '选择文件',
-                    buttonConfig:{
-                        xtype:'button',
+                    createFileInput : function() {
+                            var me = this;
+                            me.fileInputEl = me.button.el.createChild({
+                            name: me.getName(),
+                            cls: Ext.baseCSSPrefix + 'form-file-input',
+                            tag: 'input',
+                            type: 'file',
+                            size: 1
+                        }).on('change', me.onFileChange, me);
+                    },
+                    listeners: {
+                        afterrender:function(field,ops){
+                            // var fileEl = field.fileInputEl.dom;
+                            // fileEl.setAttribute("accept","image/*");
+                        },
+                        change: function(field){
+                            var form = field.ownerCt.ownerCt;
+                            var myForm = field.ownerCt;
+                            var fileEl = field.fileInputEl.dom;
+                            var fd = new FormData();
+                            fd.append('file', fileEl.files[0]);
+                            fd.append('caller', myForm.ownerCt.ownerCt.caller);
+                            form.setLoading(true);
+                            Ext.Ajax.request({
+                                url: '/api/commons/excel/import/parse',//这里是填写需要跨域访问的URL
+                                cors: true,
+                                useDefaultXhrHeader: false,
+                                method: 'post',
+                                rawData: fd,
+                                headers: {
+                                    'Access-Control-Allow-Origin': '*',
+                                    'Authorization':  saas.util.State.get('session').token,
+                                    //"Content-Type": 'multipart/form-data'  //文件上传的格式, 
+                                    "Content-Type":null
+                                },
+                                success: function (response, opts) {
+                                    form.setLoading(false);
+                                    var res = Ext.decode(response.responseText);
+                                    if(res.success){
+                                        var id = res.data;
+                                        if(id){
+                                            saas.util.BaseUtil.showSuccessToast('上传成功');
+                                            form.importId = id;
+                                        }else{
+                                            saas.util.BaseUtil.showErrorToast('上传失败:后台未返回信息');
+                                        }
+                                    }else{
+                                        saas.util.BaseUtil.showErrorToast('上传失败: ' + res.message);
+                                    }
+                                },
+                                failure: function (response, opts) {
+                                    form.setLoading(false);
+                                    var res = Ext.decode(response.responseText);
+                                    saas.util.BaseUtil.showErrorToast('上传失败: ' + res.message);
+                                }
+                            });
+                        }
                     }
                 },{
                     hidden:true,

+ 1 - 2
frontend/saas-web/app/view/core/dbfind/types/WarehouseDbfindTrigger.js

@@ -117,8 +117,7 @@ Ext.define('saas.view.core.dbfind.types.WarehouseDbfindTrigger', {
                 reqUrl: '/api/document/warehouse/save',
                 delUrl: '/api/document/warehouse/delete'
             },
-            // _parent:this.getView(),
-            // record:record,
+            caller:'WareHouse',
             session: true
         });
         this.dialog.show();

+ 10 - 61
frontend/saas-web/app/view/core/form/field/DetailGridField.js

@@ -29,9 +29,7 @@ Ext.define('saas.view.core.form.field.DetailGridField', {
 
     emptyRows: 5,
 
-    // Clearing selection disables the Actions.
     allowDeselect: true,
-    defaultActionType: 'button',
 
     initComponent: function() {
         var me = this;
@@ -46,45 +44,22 @@ Ext.define('saas.view.core.form.field.DetailGridField', {
         };
 
         Ext.apply(me, {
-            actions: {
-                copy: {
-                    iconCls: 'x-fa fa-copy',
-                    text: '复制单元格',
-                    handler: function() {
-                        me.onCopy(me.selectedData);
-                    }
-                }
-            },
-            plugins: {
-                cellediting: {
-                    clicksToEdit: 1,
-                    listeners: {
-                        edit: function(editor, context, eOpts) {
-                            context.column.fireEvent('edit', context.value);
-                        }
+            plugins: [{
+                ptype: 'cellediting',
+                clicksToEdit: 1,
+                listeners: {
+                    edit: function(editor, context, eOpts) {
+                        context.column.fireEvent('edit', context.value);
                     }
                 }
-            },
+            }, {
+                ptype: 'menuclipboard'
+            }],
             normalViewConfig: {
                 deferEmptyText: false,
                 emptyText: '无数据',
-                listeners: {
-                    itemcontextmenu: function(view, rec, node, index, e) {
-                        e.stopEvent();
-                        me.getContextMenu().show().setLocalXY(e.getXY());
-                        me.selectedData = e.target.innerText;
-                        return false;
-                    }
-                }
-            },
-            lockedGridConfig: {
-                // scrollable: {
-                //     x: false,
-                //     y: true
-                // }
             },
             lockedViewConfig: {
-                // scrollable: false,
                 scrollable: {
                     x: false,
                     y: true
@@ -536,31 +511,5 @@ Ext.define('saas.view.core.form.field.DetailGridField', {
             }
         });
         return trueData;
-    },
-
-    getContextMenu: function() {
-        var me = this;
-
-        return me.contextMenu || (me.contextMenu = me.add({
-            xtype: 'menu',
-            items: [
-                // Actions can be converted into MenuItems
-                '@copy',
-            ]
-        }));
-    },
-
-    onCopy: function(text) {
-		var target = Ext.DomHelper.append(document.body, {
-			tag: 'textarea',
-			style: 'opacity: 0;position: absolute;top: -10000px;right: 0;',
-			html: text
-		});
-		target.focus();
-		target.select();
-	    document.execCommand('Copy');
-	    target.blur();
-	    document.body.removeChild(target);
-	},
-
+    }
 });

+ 2 - 1
frontend/saas-web/app/view/document/bom/FormPanel.js

@@ -77,7 +77,8 @@ Ext.define('saas.view.document.bom.FormPanel', {
     },{
         xtype: 'textfield',
         name: 'bo_version',
-        fieldLabel: '版本'
+        fieldLabel: '版本',
+        allowBlank: false
     }, {
         xtype : "detailGridField",
         detnoColumn: 'bd_detno',

+ 1 - 1
frontend/saas-web/app/view/document/kind/ChildForm.js

@@ -34,7 +34,7 @@ Ext.define('KitchenSink.view.binding.ChildForm', {
               if(codeField){
                 w.setLoading(true);
                 //取后台编号
-                var caller = w._parent.caller;
+                var caller = w.caller || w._parent.caller;
                 saas.util.BaseUtil.request({
                     url: '/api/commons/number/getMaxnumber',
                     headers: {

+ 1 - 1
frontend/saas-web/app/view/home/infoCardList/UnauditSaleOut.js

@@ -65,7 +65,7 @@ Ext.define('saas.view.home.infoCardList.UnauditSaleOut', {
         dataIndex: 'pr_detail',
         width: 150
     }, {
-        text: '出货数量',
+        text: '数量',
         dataIndex: 'pd_outqty',
         xtype:'numbercolumn',
         width: 110,

+ 0 - 1
frontend/saas-web/app/view/main/Main.js

@@ -126,7 +126,6 @@ Ext.define('saas.view.main.Main', {
                 {
                     ui: 'header',
                     arrowVisible: false,
-                    id:"userImage", 
                     cls:' sa-nav-button',   
                     width: 50,
                     height:50,    

+ 5 - 2
frontend/saas-web/app/view/main/Navigation.js

@@ -110,8 +110,8 @@ Ext.define('saas.view.main.Navigation', {
                         var menu = view.up('menu'),
                             menuView = view.el.dom.getElementsByClassName('x-navitem-menu')[0],
                             menuBox = menuView.getBoundingClientRect(),
-                            menuViewWidth = menuBox.width,
-                            menuViewHeight = menuBox.height,
+                            menuViewWidth = menuBox.width + 12,
+                            menuViewHeight = menuBox.height + 10,
                             menuItem = menuView.getElementsByClassName('menuitem');
 
                         menu.setWidth(menuViewWidth);
@@ -184,6 +184,9 @@ Ext.define('saas.view.main.Navigation', {
                 navItem: navItem,
                 id: menuId,
                 width: window.innerWidth,
+                cls: 'x-nav-menu',
+                layout: 'fit',
+                bodyPadding: 5,
                 style: {
                     borderTopRightRadius: '4px',
                     borderBottomRightRadius: '4px'

+ 19 - 1
frontend/saas-web/app/view/main/Navigation.scss

@@ -79,6 +79,19 @@ $nav-font-color-over: #fff;
 
                                 .nav-inner-wrap {
 
+                                    &:after {
+                                        content: ' ';
+                                        width: 0;
+                                        height: 0;
+                                        border: 8px solid transparent;
+                                        border-right-color: #fff;
+                                        border-left: none;
+                                        position: absolute;
+                                        right: 0;
+                                        top: 22px;
+                                        z-index: 999999;
+                                    }
+
                                     .nav-inner-icon {
                                         color: $nav-font-color-over;
                                     }
@@ -96,6 +109,11 @@ $nav-font-color-over: #fff;
     }
 }
 
+.x-nav-menu {
+    // border-width: 5px;
+    // border-left: none;
+}
+
 .x-navitem-menu {
     position: absolute;
     z-index: 9999;
@@ -112,7 +130,7 @@ $nav-font-color-over: #fff;
 
             &:first-child {
                 .menu-content {
-                    border-right: 1px solid #EEF9FE;
+                    border-right: 1px dashed #dce2e4;
                 }
             }
 

+ 2 - 2
frontend/saas-web/app/view/money/report/CustomerCheck.js

@@ -139,7 +139,7 @@ Ext.define('saas.view.money.report.CustomerCheckCheck', {
         dataIndex: 'pd_remark',
         width: 250
     }, {
-        text: '期初应',
+        text: '期初应',
         dataIndex: 'beginamount',
         hidden: true,
         width: 0,
@@ -151,7 +151,7 @@ Ext.define('saas.view.money.report.CustomerCheckCheck', {
         width: 0,
         summaryType: 'cus',
     }, {
-        text: '本期款',
+        text: '本期款',
         dataIndex: 'nowpay',
         hidden: true,
         width: 0,

+ 3 - 4
frontend/saas-web/app/view/purchase/purchase/QueryPanel.js

@@ -79,9 +79,8 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
         ]
     }, {
         xtype: 'textfield',
-        name: 'pd_salecode',
-        fieldLabel: '关联销售单号',
-        showDetail: true,
+        name: 'pu_sacode',
+        fieldLabel: '关联销售单号'
     }, {
         xtype: 'employeeDbfindTrigger',
         name: 'creatorName',
@@ -152,7 +151,7 @@ Ext.define('saas.view.purchase.purchase.QueryPanel', {
             width: 110
         },{
             text: '关联销售单',
-            dataIndex: 'pu_salecode',
+            dataIndex: 'pu_sacode',
             width: 150
         },{
             text: '备注',

+ 6 - 6
frontend/saas-web/app/view/purchase/report/Purchase.js

@@ -105,6 +105,12 @@ Ext.define('saas.view.purchase.report.Purchase', {
             var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
             var format = '0.' + xr.join();
             return Ext.util.Format.number(v, format);
+        },
+        summaryRenderer: function(v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
         }
     }, {
         text: '单价',
@@ -182,12 +188,6 @@ Ext.define('saas.view.purchase.report.Purchase', {
             var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
             var format = '0.' + xr.join();
             return Ext.util.Format.number(v, format);
-        },
-        renderer : function(v) {
-            var arr = (v + '.').split('.');
-            var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
-            var format = '0.' + xr.join();
-            return Ext.util.Format.number(v, format);
         }
     }, {
         text: '收货金额',

+ 1 - 1
frontend/saas-web/app/view/stock/report/ProdinoutCount.js

@@ -50,7 +50,7 @@ Ext.define('saas.view.stock.report.ProdinoutCount', {
         width: 80
     }, {
         text: '仓库',
-        dataIndex:'pd_whcode',
+        dataIndex:'wh_description',
         width: 150
     }, {
         text: '期初',

+ 20 - 16
frontend/saas-web/app/view/sys/power/TreePanel.js

@@ -195,23 +195,27 @@ Ext.define('saas.view.sys.power.TreePanel', {
             return;
         }
         var me = this;
-        me.setLoading(true);
-        saas.util.BaseUtil.request({
-            url: me.deleteUrl + rec.get('id'),
-            params: '',
-            method: 'POST'
-        })
-        .then(function(localJson) {
-            me.setLoading(false);
-            if(localJson.success){
-                saas.util.BaseUtil.showSuccessToast('删除成功');
-                me.setTree();
+        saas.util.BaseUtil.deleteWarn('确定要删除该角色?',function(btn){
+            if(btn == 'yes'){
+                me.setLoading(true);
+                saas.util.BaseUtil.request({
+                    url: me.deleteUrl + rec.get('id'),
+                    params: '',
+                    method: 'POST'
+                })
+                .then(function(localJson) {
+                    me.setLoading(false);
+                    if(localJson.success){
+                        saas.util.BaseUtil.showSuccessToast('删除成功');
+                        me.setTree();
+                    }
+                })
+                .catch(function(res) {
+                    me.setLoading(false);
+                    console.error(res);
+                    saas.util.BaseUtil.showErrorToast('删除失败: ' + res.message);
+                });
             }
-        })
-        .catch(function(res) {
-            me.setLoading(false);
-            console.error(res);
-            saas.util.BaseUtil.showErrorToast('删除失败: ' + res.message);
         });
     }
 });

+ 0 - 58
frontend/saas-web/ext/packages/ux/src/feature/MySummary.js

@@ -30,16 +30,6 @@ Ext.define('Ext.ux.feature.MySummary', {
 
         me.callParent([grid]);
 
-        // var mySummaryStore = grid.mySummaryStore = Ext.create('Ext.data.Store', {
-        //     fields: ['name', 'label', 'typeLabel', 'type', 'value'],
-        //     data: [{
-        //         name: 'xxx',
-        //         label: '111',
-        //         type: 'sum',
-        //         value: 0
-        //     }]
-        // });
-
         grid.on({
             mysummarychange: me.refreshData,
             scope: me
@@ -129,54 +119,6 @@ Ext.define('Ext.ux.feature.MySummary', {
         newSummarys = me.getSummarys(grid);
 
         summaryBar.update(newSummarys);
- 
-        // if (!view.rendered) {
-        //     return;
-        // }
- 
-        // record = me.createSummaryRecord(view);
-        // newRowDom = Ext.fly(view.createRowElement(record, -1)).down(selector, true);
- 
-        // if (!newRowDom) {
-        //     return;
-        // }
- 
-        // // Summary row is inside the docked summaryBar Component 
-        // if (dock) {
-        //     p = me.summaryBar.item.dom.firstChild;
-        //     oldRowDom = p.firstChild;
-            
-        //     p.insertBefore(newRowDom, oldRowDom);
-        //     p.removeChild(oldRowDom);
-        // }
-        // // Summary row is a regular row in a THEAD inside the View. 
-        // // Downlinked through the summary record's ID 
-        // else {
-        //     oldRowDom = view.el.down(selector, true);
-        //     p = oldRowDom && oldRowDom.parentNode;
-            
-        //     if (p) {
-        //         p.removeChild(oldRowDom);
-        //     }
-            
-        //     // We're always inserting the new summary row into the last rendered row, 
-        //     // unless no rows exist. In that case we will be appending to the special 
-        //     // placeholder in the node container. 
-        //     p = view.getRow(view.all.last());
-            
-        //     if (p) {
-        //         p = p.parentElement;
-        //     }
-        //     // View might not have nodeContainer yet. 
-        //     else {
-        //         p = me.getSummaryRowPlaceholder(view);
-        //         p = p && p.tBodies && p.tBodies[0];
-        //     }
-            
-        //     if (p) {
-        //         p.appendChild(newRowDom);
-        //     }
-        // }
     },
 
     getSummaryBar: function() {

+ 185 - 0
frontend/saas-web/ext/packages/ux/src/plugin/MenuClipboard.js

@@ -0,0 +1,185 @@
+Ext.define('Ext.ux.plugin.MenuClipboard', {
+    extend: 'Ext.plugin.Abstract',
+    alias: 'plugin.menuclipboard',
+
+    copyCls : 'grid-copy',
+
+    formats: {
+        cell: {
+            get: 'getCells'
+        },
+        html: {
+            get: 'getCellData'
+        },
+        raw: {
+            get: 'getCellData',
+            put: 'putCellData'
+        }
+    },
+
+    constructor: function (config) {
+        if (config) {
+            this.pluginConfig = config;
+            this.cmp = config.cmp;
+            this.initConfig(config);
+        }
+    },
+
+    initConfig: function() {
+        var me = this;
+
+        me.applyEventListeners();
+
+        me.callParent(arguments);
+    },
+
+    isExecable: function() {
+		return Ext.isChrome && Number(Ext.userAgent.match(/chrome\/[\d.]+/gi)[0].replace(/[^0-9.]/ig,"").substring(0, 2)) > 42;
+	},
+
+    applyEventListeners: function() {
+        var me = this,
+        grid = me.cmp;
+
+        me.execable = me.isExecable();
+
+        grid.on({
+            cellcontextmenu (view, td, cellIndex, record, tr, rowIndex, e, eOpts) {
+                e.stopEvent();
+                me.getContextMenu(view, td, cellIndex, record, tr, rowIndex, e, eOpts);
+                return false;
+            },
+        });
+    },
+
+    getContextMenu : function(view, td, colIdx, record, tr, rowIdx, e) {
+		var me = this,
+			grid = me.cmp,
+			column = view.getHeaderByCell(td) || view.ownerCt.headerCt.getHeaderAtIndex(colIdx);
+
+		if (!column) {
+			return;
+		}
+		var dataIndex = column.dataIndex;
+		e.preventDefault();
+	    var menu = view.copymenu;
+		if (!menu) {
+			menu = view.copymenu = me.createMenu();
+		}
+		menu.showAt(e.getXY());
+		// me.clearCopyCls();
+		menu.grid = grid;
+		menu.td = td,
+		menu.record = record;
+		menu.column = column;
+		menu.dataIndex = dataIndex;
+		menu.cell = view.getCell(menu.record, menu.column);
+		// menu.cell.addCls(me.copyCls);
+    },
+    
+    createMenu : function() {
+		var me = this;
+		return Ext.create('Ext.menu.Menu', {
+			bodyCls:'copyMenu',
+			items: [{
+				copyType : 'cell',
+				iconCls : 'x-button-icon-copy',
+				text : '复制单元格',
+				handler: function(item) {
+					if(me.execable) {
+						var m = item.ownerCt;
+						me.onCopy(me.getCellText(m.grid, m.td, m.record, m.column, m.dataIndex, m.cell));
+					}
+				}
+			// },{
+			// 	copyType : 'row',
+			// 	text : '复制行',
+			// 	handler: function(item) {
+			// 		if(me.execable) {
+			// 			var m = item.ownerCt;
+			// 			me.onCopy(me.getRecordText(m.grid, m.td, m.record, m.column, m.dataIndex, m.cell));
+			// 		}
+			// 	}
+			// },{
+			// 	copyType : 'table',
+			// 	text : '复制表格',
+			// 	handler: function(item) {
+			// 		if(me.execable) {
+			// 			var m = item.ownerCt;
+			// 			me.onCopy(me.getTableText(m.grid));
+			// 		}
+			// 	}
+			// },{
+		    // 	xtype: 'menuseparator',cls:'x-copymenu-spt'
+		    // },{
+			// 	text : '复制到整列',
+			// 	handler : function(t, e) {
+			// 		var m = t.up('menu'),
+			// 		val = me.getCellText(m.grid, m.record, m.column, m.dataIndex);
+		    // 		m && me.onColumnPaste(val, m.grid, m.column, m.record, m.dataIndex, m.cell, e);
+		    // 	}
+			// },{
+		    // 	xtype: 'menuseparator',cls:'x-copymenu-spt'
+		    // },{
+		    // 	text : '粘贴',
+		    // 	iconCls : 'x-button-icon-paste',
+		    // 	handler : function() {
+		    // 		me.onCellPaste();
+		    // 	}
+		    }]
+		});
+    },
+    
+    getCellText : function(grid, td, record, column, dataIndex, cell) {
+		var v = record.get(dataIndex), cv;
+		v = v || cell.textContent;
+        if(Ext.isDate(v)) {
+            cv = Ext.Date.format(v, column.format || Ext.Date.defaultFormat);
+        }else if(Ext.isNumber(v)) {
+            cv = v + '';
+        }else {
+            cv = v;
+        }
+		return cv;
+	},
+	
+	// getRecordText : function(grid, td, record, column, dataIndex, cell) {
+	// 	var me = this, s = [], columns = grid.headerCt.getGridColumns(), v = null;
+	// 	Ext.each(columns, function(c){
+	// 		if(!c.hidden && c.dataIndex && c.getWidth() > 0) {
+	// 			v = me.getCellText(grid, td, record, column, dataIndex, cell);
+	// 			if(c == null) {
+	// 				s.push(' ');
+	// 			} else {
+	// 				if(Ext.isDate(v)) {
+	// 					s.push(Ext.Date.format(v, c.format || Ext.Date.defaultFormat));
+	// 				} else {
+	// 					s.push(v);
+	// 				}
+	// 			}
+	// 		}
+	// 	});
+	// 	return s.join('\t');
+	// },
+
+	getTableText : function(grid) {
+		var me = this, s = [];
+		grid.store.each(function(){
+			s.push(me.getRecordText(grid, this));
+		});
+		return s.join('\n');
+	},
+
+    onCopy: function(text) {
+		var target = Ext.DomHelper.append(document.body, {
+			tag: 'textarea',
+			style: 'opacity: 0;position: absolute;top: -10000px;right: 0;',
+			html: text
+		});
+		target.focus();
+		target.select();
+	    document.execCommand('Copy');
+	    target.blur();
+	    document.body.removeChild(target);
+	},
+});