hy 7 years ago
parent
commit
8573b99657
83 changed files with 2129 additions and 379 deletions
  1. 0 9
      applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/dto/ListReqDTO.java
  2. 3 1
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/ExcelController.java
  3. 0 2
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/CommonMapper.java
  4. 3 1
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/EndProductMapper.java
  5. 1 4
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/CommonServiceImpl.java
  6. 6 2
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/EndProductServiceImpl.java
  7. 48 36
      applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/ExcelServiceImpl.java
  8. 0 3
      applications/commons/commons-server/src/main/resources/mapper/CommonMapper.xml
  9. 1 1
      applications/commons/commons-server/src/main/resources/mapper/DataImportDetailMapper.xml
  10. 2 2
      applications/commons/commons-server/src/main/resources/mapper/DataImportMapper.xml
  11. 1 1
      applications/commons/commons-server/src/main/resources/mapper/DataTempletMapper.xml
  12. 6 2
      applications/commons/commons-server/src/main/resources/mapper/EndProductMapper.xml
  13. 2 0
      applications/document/document-dto/src/main/java/com.usoftchina.saas.document.dto/CustomerDTO.java
  14. 2 0
      applications/document/document-dto/src/main/java/com/usoftchina/saas/document/entities/Customer.java
  15. 2 0
      applications/document/document-dto/src/main/java/com/usoftchina/saas/document/entities/CustomerList.java
  16. 0 2
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/CustomerMapper.java
  17. 2 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/EmployeeMapper.java
  18. 2 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/mapper/ProductMapper.java
  19. 13 0
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/CustomerServiceImpl.java
  20. 6 1
      applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/ProductServiceImpl.java
  21. 1 0
      applications/document/document-server/src/main/resources/mapper/CustomerListMapper.xml
  22. 11 32
      applications/document/document-server/src/main/resources/mapper/CustomerMapper.xml
  23. 3 0
      applications/document/document-server/src/main/resources/mapper/EmployeeMapper.xml
  24. 15 0
      applications/document/document-server/src/main/resources/mapper/ProductMapper.xml
  25. 1 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/mapper/CustomerCheckViewMapper.java
  26. 1 1
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/mapper/VendorAcountViewMapper.java
  27. 26 10
      applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/MoneyReportServiceImpl.java
  28. 6 7
      applications/money/money-server/src/main/resources/mapper/CustomerCheckViewMapper.xml
  29. 6 7
      applications/money/money-server/src/main/resources/mapper/VendorAcountViewMapper.xml
  30. 1 1
      applications/sale/sale-server/src/main/resources/config/application-docker-test.yml
  31. 0 1
      base-servers/gateway-server/src/main/resources/application.yml
  32. 11 1
      framework/core/src/main/java/com/usoftchina/saas/utils/DateUtils.java
  33. 2 1
      frontend/saas-portal-web/config/index.js
  34. 2 2
      frontend/saas-portal-web/src/components/conenter/home.vue
  35. 42 10
      frontend/saas-portal-web/src/components/conenter/problem.vue
  36. 1 1
      frontend/saas-portal-web/src/components/footer/footer.vue
  37. 0 4
      frontend/saas-portal-web/static/css/main.css
  38. 37 64
      frontend/saas-web/app.json
  39. 4 0
      frontend/saas-web/app/Application.scss
  40. 2 2
      frontend/saas-web/app/view/core/dbfind/types/BankInfoDbfindTrigger.js
  41. 1 1
      frontend/saas-web/app/view/core/dbfind/types/CustomerDbfindTrigger.js
  42. 1 1
      frontend/saas-web/app/view/core/dbfind/types/EmployeeDbfindTrigger.js
  43. 1 11
      frontend/saas-web/app/view/core/dbfind/types/OriOrderMutiDbfindTrigger.js
  44. 1 1
      frontend/saas-web/app/view/core/dbfind/types/ProductDbfindTrigger.js
  45. 1 1
      frontend/saas-web/app/view/core/dbfind/types/ProductMultiDbfindTrigger.js
  46. 1 1
      frontend/saas-web/app/view/core/dbfind/types/VendorDbfindTrigger.js
  47. 1 1
      frontend/saas-web/app/view/core/dbfind/types/WarehouseDbfindTrigger.js
  48. 0 1
      frontend/saas-web/app/view/core/form/field/DetailGridField.js
  49. 0 1
      frontend/saas-web/app/view/core/query/QueryGridPanel.js
  50. 27 8
      frontend/saas-web/app/view/core/report/ReportPanel.js
  51. 4 0
      frontend/saas-web/app/view/document/customer/BasePanel.js
  52. 7 1
      frontend/saas-web/app/view/document/customer/FormPanel.js
  53. 31 31
      frontend/saas-web/app/view/document/product/BasePanel.js
  54. 0 1
      frontend/saas-web/app/view/home/InfoCard.scss
  55. 3 3
      frontend/saas-web/app/view/money/report/CustomerCheck.js
  56. 63 0
      frontend/saas-web/app/view/money/report/TotalPayDetail.js
  57. 4 0
      frontend/saas-web/app/view/money/report/TotalPayDetailController.js
  58. 5 0
      frontend/saas-web/app/view/money/report/TotalPayDetailModel.js
  59. 62 0
      frontend/saas-web/app/view/money/report/TotalRecDetail.js
  60. 19 0
      frontend/saas-web/app/view/money/report/TotalRecDetailController.js
  61. 6 0
      frontend/saas-web/app/view/money/report/TotalRecDetailModel.js
  62. 3 3
      frontend/saas-web/app/view/money/report/VendorCheck.js
  63. 7 6
      frontend/saas-web/app/view/purchase/purchase/FormPanel.js
  64. 1 1
      frontend/saas-web/app/view/purchase/purchase/FormPanelController.js
  65. 2 0
      frontend/saas-web/app/view/purchase/purchaseOut/FormPanelController.js
  66. 5 5
      frontend/saas-web/app/view/sale/sale/FormPanel.js
  67. 8 6
      frontend/saas-web/app/view/stock/appropriationInOut/QueryPanel.js
  68. 6 0
      frontend/saas-web/app/view/stock/make/QueryPanel.js
  69. 7 1
      frontend/saas-web/app/view/stock/otherIn/QueryPanel.js
  70. 7 1
      frontend/saas-web/app/view/stock/otherOut/QueryPanel.js
  71. 112 68
      frontend/saas-web/app/view/stock/report/DataList.js
  72. 22 4
      frontend/saas-web/app/view/stock/report/DataListController.js
  73. 2 2
      frontend/saas-web/app/view/sys/account/DataList.js
  74. 14 0
      frontend/saas-web/electron/.gitignore
  75. 32 0
      frontend/saas-web/electron/main.dev.js
  76. 42 0
      frontend/saas-web/electron/main.js
  77. 21 0
      frontend/saas-web/electron/package.json
  78. 1289 0
      frontend/saas-web/electron/yarn.lock
  79. 5 0
      frontend/saas-web/overrides/grid/Panel.js
  80. 19 0
      frontend/saas-web/overrides/grid/Panel.scss
  81. 3 3
      frontend/saas-web/package.json
  82. BIN
      frontend/saas-web/resources/images/grid/empty.png
  83. 12 4
      frontend/saas-web/resources/json/navigation.json

+ 0 - 9
applications/commons/commons-dto/src/main/java/com/usoftchina/saas/commons/dto/ListReqDTO.java

@@ -21,15 +21,6 @@ public class ListReqDTO implements Serializable {
 
     private String calculateFields;
 
-    private String ym;
-
-    public String getYm() {
-        return ym;
-    }
-
-    public void setYm(String ym) {
-        this.ym = ym;
-    }
 
     //将列拼成查询语句,直接查询出数据的格式为json
     public String getCalculateFieldsSql() {

+ 3 - 1
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/controller/ExcelController.java

@@ -3,6 +3,7 @@ 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 com.usoftchina.saas.utils.DateUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.Workbook;
 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
@@ -15,6 +16,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.net.URLEncoder;
+import java.util.Date;
 import java.util.Map;
 
 /**导入模板下载、解析
@@ -32,7 +34,7 @@ public class ExcelController {
     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 title = map.get("title").toString() + "_" + DateUtils.format(new Date(), "yyyyMMdd");
         String filename = URLEncoder.encode(title + ".xlsx", "UTF-8");
         response.setContentType("application/vnd.ms-excel");
         response.setHeader("Content-Disposition", "attachment;filename=" + filename);

+ 0 - 2
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/CommonMapper.java

@@ -4,8 +4,6 @@ import org.apache.ibatis.annotations.Param;
 
 public interface CommonMapper {
 
-    int getCountBaseSet(@Param("companyId") Long companyId);
-
     int getCountWarehouse(@Param("companyId") Long companyId);
 
     int getCountProduct(@Param("companyId") Long companyId);

+ 3 - 1
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/mapper/EndProductMapper.java

@@ -10,7 +10,7 @@ public interface EndProductMapper {
 
     void endProduct(Map<String, Object> map);
 
-    void endFund(Map<String, Object> map);
+    void end(Map<String, Object> map);
 
     String selectPeriod(@Param("companyId") Long companyId);
 
@@ -20,6 +20,8 @@ public interface EndProductMapper {
 
     void updatePeriodStatus(@Param("status") Long status,@Param("period") String period, @Param("companyId") Long companyId);
 
+    void updateRe(@Param("ym") String ym, @Param("companyId") Long companyId);
+
     int checkPay(Long companyId);
     int checkRec(Long companyId);
     void deleteSub(Long companyId);

+ 1 - 4
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/CommonServiceImpl.java

@@ -23,10 +23,7 @@ public class CommonServiceImpl implements CommonService {
         InitStatusDTO result = new InitStatusDTO();
         int count = 0;
         Long companyId = BaseContextHolder.getCompanyId();
-        count = commonMapper.getCountBaseSet(companyId);
-        if (count > 0){
-            result.setBaseSet(true);
-        }
+        result.setBaseSet(true);
         count = commonMapper.getCountWarehouse(companyId);
         if (count > 0){
             result.setWarehouse(true);

+ 6 - 2
applications/commons/commons-server/src/main/java/com/usoftchina/saas/commons/service/impl/EndProductServiceImpl.java

@@ -16,6 +16,7 @@ import com.usoftchina.saas.exception.BizException;
 import com.usoftchina.saas.page.PageRequest;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 
 import java.util.HashMap;
@@ -55,6 +56,7 @@ public class EndProductServiceImpl implements EndProductService {
         return map;
     }
 
+    @Transactional
     @Override
     public String endAccount() {
         String period = endProductMapper.selectPeriod(BaseContextHolder.getCompanyId());
@@ -63,14 +65,15 @@ public class EndProductServiceImpl implements EndProductService {
         map.put("yearMonth", period);
         map.put("companyId", BaseContextHolder.getCompanyId());
         map.put("result", null);
-        endProductMapper.endProduct(map);
-        endProductMapper.endFund(map);
+//        endProductMapper.endProduct(map);
+        endProductMapper.end(map);
         endProductMapper.updatePeriodStatus(99L, period, BaseContextHolder.getCompanyId());
         DocBaseDTO docBaseDTO = generateMsgObj(Long.parseLong(period));
         messageLogService.customizeLog(docBaseDTO, Operation.ENDPRODUCT);
         return String.valueOf(map.get("result"));
     }
 
+    @Transactional
     @Override
     public void unEndAccount() {
         int payc = endProductMapper.checkPay(BaseContextHolder.getCompanyId());
@@ -84,6 +87,7 @@ public class EndProductServiceImpl implements EndProductService {
         if (StringUtils.isEmpty(period)){
             throw new BizException(BizExceptionCode.BIZ_UNENDPRODUCT);
         }else{
+            endProductMapper.updateRe(period, BaseContextHolder.getCompanyId());
             endProductMapper.updatePeriodStatus(0L, period, BaseContextHolder.getCompanyId());
             messageLogService.customizeLog(generateMsgObj(Long.parseLong(period)), Operation.UNENDPRODUCT);
         }

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

@@ -12,6 +12,7 @@ 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.DateUtils;
 import com.usoftchina.saas.utils.StringUtils;
 import org.apache.poi.hssf.util.HSSFColor;
 import org.apache.poi.ss.usermodel.*;
@@ -45,6 +46,9 @@ public class ExcelServiceImpl implements ExcelService{
         Map<String, Object> map = new HashMap<>();
         SXSSFWorkbook workbook = new SXSSFWorkbook();
         DataTemplet dataTemplet = dataTempletMapper.selectByCaller(caller, companyId);
+        if (null == dataTemplet) {
+            throw new BizException(9876, "没有查询到对应的excel配置");
+        }
         //列
         String cols = dataTemplet.getDt_columns();
         JSONArray array = (JSONArray) JSONArray.parse(cols);
@@ -70,7 +74,6 @@ public class ExcelServiceImpl implements ExcelService{
     }
 
     @Override
-    @Transactional
     public Integer parseTemplet(Workbook wb, String caller) {
         if (wb == null || StringUtils.isEmpty(caller)) {
             throw new BizException(BizExceptionCode.NULL_DATA);
@@ -136,7 +139,6 @@ public class ExcelServiceImpl implements ExcelService{
             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);
@@ -177,25 +179,21 @@ public class ExcelServiceImpl implements ExcelService{
                            if (difference) {
                                dd.setDd_codevalue(codeValue);
                                if ("true".equals(set.getNecessary()) && data.get("*" + set.getDescription()).equals("")) {
-                                   err.append("第" + (i + 2) + "行 " + set.getDescription() + " 必填字段未填写! ");
+                                   err.append("第" + (i + 3) + "行 " + set.getDescription() + " 必填字段未填写!<br/> ");
                                    break;
                                }
                            }
                            //检测日期类型是否规范
-                           if ("date".equals(set.getType())) {
-                               flag = validateDateFormat(value);
-                               if (!flag) {
-                                   err.append("第" + (i + 2) + "行 " + set.getDescription() + " 日期格式不正确! ");
+                           if ("date".equals(set.getType()) && !StringUtils.isEmpty(value)) {
+                               value = praseDate(value);
+                               if (null == value) {
+                                   err.append("第" + (i + 3) + "行 " + set.getDescription() + " 日期格式不正确!<br/> ");
                                    break;
                                }
                            }
                            //插入主表数据
                            if (null != mainData) {
-                               if ("true".equals(set.getNecessary())) {
-                                   mainData.put(set.getField(), value);
-                               } else {
-                                   mainData.put(set.getField(), value);
-                               }
+                               mainData.put(set.getField(), value);
                            }
                        }
                        //所有主表数据进行分类
@@ -214,24 +212,20 @@ public class ExcelServiceImpl implements ExcelService{
                            } 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() + " 必填字段未填写! ");
+                           if ("true".equals(set.getNecessary()) && value.equals("")) {
+                               err.append("第" + (i + 3) + "行 " + set.getDescription() + " 必填字段未填写!<br/> ");
                                break;
                            }
                            //检测日期类型是否规范
-                           if ("date".equals(set.getType())) {
-                               flag = validateDateFormat(value);
-                               if (!flag) {
-                                   err.append("第" + (i + 2) + "行 " + set.getDescription() + " 日期格式不正确! ");
+                           if ("date".equals(set.getType()) && !StringUtils.isEmpty(value)) {
+                               value = praseDate(value);
+                               if (null == value) {
+                                   err.append("第" + (i + 3) + "行 " + set.getDescription() + " 日期格式不正确!<br/> ");
                                    break;
                                }
                            }
+                           //拼从表数据
+                           detailData.put(set.getField(), value);
                        }
                        if (detailData.size() > 0) {
                            dd.setDd_codevalue(codeValue);
@@ -257,7 +251,7 @@ public class ExcelServiceImpl implements ExcelService{
         if (StringUtils.isEmpty(date)) {
             return false;
         }
-        String regEx1 = "[0-9]{8}";
+        String regEx1 = "[0-9]{4}/[0-9]{2}/[0-9]{2}";
         String regEX2 = "[0-9]{4}-[0-9]{2}-[0-9]{2}";
         // 编译正则表达式
         Pattern pattern1 = Pattern.compile(regEx1);
@@ -271,6 +265,15 @@ public class ExcelServiceImpl implements ExcelService{
         return flag;
     }
 
+    private String praseDate(String num) {
+        try {
+            Integer days = Integer.valueOf(num);
+            return DateUtils.plusDay(days, "1899-12-30");
+        }catch (Exception e) {
+            return null;
+        }
+    }
+
     //保证先遍历主表
     private List<String> SetToList(Set<String> sets) {
         List<String> list = new ArrayList<>();
@@ -290,6 +293,10 @@ public class ExcelServiceImpl implements ExcelService{
             switch(cell.getCellType()){
                 case Cell.CELL_TYPE_NUMERIC:{
                     cellValue = String.valueOf(cell.getNumericCellValue());
+                    //判断是否为INT类型
+                    if (Double.valueOf(cellValue.toString()).intValue() - Double.valueOf(cellValue.toString()) == 0) {
+                        return cellValue.toString().substring(0, cellValue.toString().indexOf("."));
+                    }
                     break;
                 }
                 case Cell.CELL_TYPE_FORMULA:{
@@ -336,9 +343,10 @@ public class ExcelServiceImpl implements ExcelService{
      */
     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);// 固定列
+        CellStyle style = getCellStyle(workbook, true);
+        CellStyle detailStyle = getCellStyle(workbook, false);
+        //sheet.autoSizeColumn(2);
+       // sheet.createFreezePane(0, 1);// 固定列
         Cell cell = null;
         int rIdx = 0;
         int cIdx = 0;
@@ -347,8 +355,8 @@ public class ExcelServiceImpl implements ExcelService{
         Row row = null;
         if (remark != null) {
             row = sheet.createRow(rIdx);
-            row.setHeightInPoints((short) 100);
-            sheet.setColumnWidth(cIdx, 1000);
+            row.setHeightInPoints((short) 50);
+            sheet.setColumnWidth(cIdx, 500);
             cell = getCell(sheet, rIdx, cIdx);
             cell.setCellValue(remark);
             sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, cols.size() - 1));
@@ -365,19 +373,23 @@ public class ExcelServiceImpl implements ExcelService{
                 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);
+               // 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);
+                if ("main".equals(obj.get("position"))) {
+                    cell.setCellStyle(style);
+                } else {
+                    cell.setCellStyle(detailStyle);
+                }
+                cell.setCellValue(value);
+                keys.add(String.valueOf(obj.get("description")));
                 cIdx++;
                 value = "";
             }
@@ -410,7 +422,7 @@ public class ExcelServiceImpl implements ExcelService{
         }
     }
 
-    private CellStyle getCellStyle(SXSSFWorkbook workbook) {
+    private CellStyle getCellStyle(SXSSFWorkbook workbook, boolean main) {
         CellStyle style = workbook.createCellStyle();
         style.setFillBackgroundColor((short) 18);
         style.setFillPattern(FillPatternType.LEAST_DOTS);
@@ -421,7 +433,7 @@ public class ExcelServiceImpl implements ExcelService{
         style.setFont(font);
         style.setAlignment(HorizontalAlignment.CENTER);
         style.setFillForegroundColor(HSSFColor.GREEN.index);
-        style.setFillBackgroundColor(HSSFColor.PALE_BLUE.index);
+        style.setFillBackgroundColor(main ? HSSFColor.LIGHT_YELLOW.index : HSSFColor.PALE_BLUE.index);
         style.setBorderBottom(BorderStyle.MEDIUM);
         style.setBorderLeft(BorderStyle.MEDIUM);
         style.setBorderRight(BorderStyle.MEDIUM);

+ 0 - 3
applications/commons/commons-server/src/main/resources/mapper/CommonMapper.xml

@@ -1,9 +1,6 @@
 <?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.CommonMapper" >
-    <select id="getCountBaseSet" resultType="int">
-        SELECT COUNT(*) FROM ENTERPRISE WHERE COMPANYID = #{companyId}
-    </select>
     <select id="getCountWarehouse" resultType="int">
         SELECT COUNT(*) FROM WAREHOUSE WHERE COMPANYID=#{companyId} AND WH_STATUSCODE = 'OPEN'
     </select>

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

@@ -15,7 +15,7 @@
   </resultMap>
 
   <delete id="deleteByIds">
-    delete from data_importdetail where dd_diid in (${ids})
+    delete from data_importdetail where dd_diid in (${value})
   </delete>
 
   <insert id="insertSelective" parameterType="com.usoftchina.saas.commons.po.DataImportDetail" >

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

@@ -6,7 +6,7 @@
   il_toformal=0 and il_result is not null
 </delete>
   <delete id="deleteByIds">
-    delete from data_import where di_id in (${ids});
+    delete from data_import where di_id in (${value});
   </delete>
 
   <insert id="insertSelective" parameterType="com.usoftchina.saas.commons.po.DataImport" >
@@ -72,7 +72,7 @@
     update data_import
     set
     di_result = #{err},
-    di_success = 0,
+    di_success = 0
     where di_id = #{id}
   </update>
 

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

@@ -12,6 +12,6 @@
   </resultMap>
 
   <select id="selectByCaller" resultMap="BaseResultMap">
-    select * from data_Templet where dt_caller=#{caller} and companyid = #{companyid}
+    select * from data_Templet where dt_caller=#{caller}
   </select>
 </mapper>

+ 6 - 2
applications/commons/commons-server/src/main/resources/mapper/EndProductMapper.xml

@@ -29,14 +29,18 @@
         CALL SP_ENDPRODUCT(?, ?, ?)
     </select>
 
-    <select id="endFund" parameterMap="spParamMap" statementType="CALLABLE">
-        CALL SP_ENDFUND(?, ?, ?)
+    <select id="end" parameterMap="spParamMap" statementType="CALLABLE">
+        CALL SP_END(?, ?, ?)
     </select>
 
     <update id="updatePeriodStatus" >
         update periodsdetail set pd_status=#{status} where pd_detno=#{period} and companyId=#{companyId}
     </update>
 
+    <update id="updateRe" >
+        UPDATE receivablesdetail SET RD_STATUS=0 WHERE date_format(rd_date, '%Y%m')=#{ym} AND companyid=#{companyId};
+    </update>
+
     <select id="checkPay" parameterType="java.lang.Long" resultType="java.lang.Integer">
         select count(1) from vendor where (ve_id,companyid) in (select pb_vendid,companyid from (
         select pbd_ym,pb_vendid,paybalance.companyid from paybalance,paybalancedetail where pb_id=pbd_pbid and pbd_slkind='期初余额'

+ 2 - 0
applications/document/document-dto/src/main/java/com.usoftchina.saas.document.dto/CustomerDTO.java

@@ -14,6 +14,8 @@ import java.util.Date;
 public class CustomerDTO extends CommonBaseDTO implements Serializable {
     private String cu_code;
 
+    private String cu_shortname;
+
     private String cu_name;
 
     private String cu_uu;

+ 2 - 0
applications/document/document-dto/src/main/java/com/usoftchina/saas/document/entities/Customer.java

@@ -10,6 +10,8 @@ public class Customer extends CommonBaseEntity implements Serializable {
 
     private String cu_code;
 
+    private String cu_shortname;
+
     private String cu_name;
 
     private String cu_uu;

+ 2 - 0
applications/document/document-dto/src/main/java/com/usoftchina/saas/document/entities/CustomerList.java

@@ -15,6 +15,8 @@ public class CustomerList extends CommonBaseEntity{
 //customer
     private String cu_code;
 
+    private String cu_shortname;
+
     private String cu_name;
 
     private String cu_uu;

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

@@ -17,8 +17,6 @@ public interface CustomerMapper extends CommonBaseMapper<Customer> {
 
     int updateByPrimaryKeySelective(Customer record);
 
-    int updateByPrimaryKey(Customer record);
-
     String selectCodeById(Long id);
 
     Integer validateCodeWhenInsert(@Param("code") String code, @Param("companyId") Long companyId);

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

@@ -32,4 +32,6 @@ public interface EmployeeMapper extends CommonBaseMapper<Employee> {
     int validateNameAndCodeWhenInsert(@Param("code") String code,@Param("name") String em_name,@Param("companyId") Long companyId);
 
     int validateNameAndCodeWhenUpdate(@Param("code") String code,@Param("name") String em_name,@Param("id") Long id,@Param("companyId") Long companyId);
+
+    List<Employee> selectByName(@Param("name") String name, @Param("companyId") Long companyId);
 }

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

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

+ 13 - 0
applications/document/document-server/src/main/java/com/usoftchina/saas/document/service/impl/CustomerServiceImpl.java

@@ -491,6 +491,8 @@ public class CustomerServiceImpl extends CommonBaseServiceImpl<CustomerMapper, C
         return getMapper().getCombo(id,BaseContextHolder.getCompanyId());
     }
 
+    @Autowired
+    private EmployeeMapper employeeMapper;
     @Override
     public void saveToFormal(Integer id, boolean update) {
         if (null == id || "0".equals(id)) {
@@ -511,6 +513,17 @@ public class CustomerServiceImpl extends CommonBaseServiceImpl<CustomerMapper, C
                 List<DataImportDetail> data = datas.get(code);
                 DataImportDetail main = dataImportMapper.selectMainBycode(code, id, companyId);
                 CustomerDTO customerDTO = JSONObject.parseObject(main.getDd_maindata(), CustomerDTO.class);
+                //验证业务员
+                if (!StringUtils.isEmpty(customerDTO.getCu_sellername())) {
+                    List<Employee> employees = employeeMapper.selectByName(customerDTO.getCu_sellername(), companyId);
+                    if (null == employees || employees.size() == 0 || StringUtils.isEmpty(employees.get(0))) {
+                        err.append("客户编号为: " + customerDTO.getCu_code() + " 的业务员: "+ customerDTO.getCu_sellername() +" 在系统中不存在,请确认数据是否正确");
+                        break;
+                    }
+                    customerDTO.setCu_sellerid(Integer.valueOf(employees.get(0).getId().toString()));
+                    customerDTO.setCu_sellercode(employees.get(0).getEm_code());
+                    customerDTO.setCu_sellername(employees.get(0).getEm_name());
+                }
                 customerDTO.setCu_status(Status.OPEN.getDisplay());
                 customerDTO.setCu_statuscode(Status.OPEN.name());
                 //编号不存在

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

@@ -617,7 +617,12 @@ public class ProductServiceImpl extends CommonBaseServiceImpl<ProductMapper, Pro
         if(condition == null){
             condition = "1=1";
         }
-        return getMapper().selectReserveCost(condition, companyId);
+        if ("DETAIL".equals(listReqDTO.getMode())) {
+            return getMapper().selectReserveCost(condition, companyId);
+        } else {
+            return getMapper().selectReserveCostByIgnoreWarehouse(condition, companyId);
+        }
+
     }
 
     private List<ProductDTO> getList(ListReqDTO listReqDTO){

+ 1 - 0
applications/document/document-server/src/main/resources/mapper/CustomerListMapper.xml

@@ -4,6 +4,7 @@
   <resultMap id="BaseResultMap" type="com.usoftchina.saas.document.entities.CustomerList">
     <id column="cu_id" jdbcType="INTEGER" property="id" />
     <result column="cu_code" jdbcType="VARCHAR" property="cu_code" />
+    <result column="cu_shortname" jdbcType="VARCHAR" property="cu_shortname"/>
     <result column="cu_name" jdbcType="VARCHAR" property="cu_name" />
     <result column="cu_uu" jdbcType="VARCHAR" property="cu_uu" />
     <result column="cu_type" jdbcType="VARCHAR" property="cu_type" />

+ 11 - 32
applications/document/document-server/src/main/resources/mapper/CustomerMapper.xml

@@ -4,6 +4,7 @@
   <resultMap id="BaseResultMap" type="com.usoftchina.saas.document.entities.Customer">
     <id column="cu_id" jdbcType="INTEGER" property="id" />
     <result column="cu_code" jdbcType="VARCHAR" property="cu_code" />
+    <result column="cu_shortname" jdbcType="VARCHAR" property="cu_shortname" />
     <result column="cu_name" jdbcType="VARCHAR" property="cu_name" />
     <result column="cu_uu" jdbcType="VARCHAR" property="cu_uu" />
     <result column="cu_type" jdbcType="VARCHAR" property="cu_type" />
@@ -32,7 +33,7 @@
     <result column="cu_remark" jdbcType="VARCHAR" property="cu_remark" />
   </resultMap>
   <sql id="Base_Column_List">
-    cu_id, cu_code, cu_name, cu_uu, cu_type, cu_begindate, cu_beginaramount, cu_beginprerecamount, 
+    cu_id, cu_code,cu_shortname, cu_name, cu_uu, cu_type, cu_begindate, cu_beginaramount, cu_beginprerecamount,
     cu_promisedays, cu_taxrate, cu_sellerid, cu_sellercode, cu_sellername, cu_credit, 
     cu_status, cu_statuscode, companyid,
     updaterid, updatetime, cu_text1, cu_text2, cu_text3, cu_text4, cu_text5, cu_leftamount, 
@@ -58,6 +59,9 @@
       <if test="cu_code != null">
         cu_code,
       </if>
+      <if test="cu_shortname != null">
+        cu_shortname,
+      </if>
       <if test="cu_name != null">
         cu_name,
       </if>
@@ -151,6 +155,9 @@
       <if test="cu_code != null">
         #{cu_code,jdbcType=VARCHAR},
       </if>
+      <if test="cu_shortname !=null">
+        #{cu_shortname,jdbcType=VARCHAR}
+      </if>
       <if test="cu_name != null">
         #{cu_name,jdbcType=VARCHAR},
       </if>
@@ -246,6 +253,9 @@
       <if test="cu_code != null">
         cu_code = #{cu_code,jdbcType=VARCHAR},
       </if>
+      <if test="cu_shortname !=null">
+        cu_shortname = #{cu_shortname,jdbcType=VARCHAR},
+      </if>
       <if test="cu_name != null">
         cu_name = #{cu_name,jdbcType=VARCHAR},
       </if>
@@ -327,37 +337,6 @@
     </set>
     where cu_id = #{id,jdbcType=INTEGER}
   </update>
-  <update id="updateByPrimaryKey" parameterType="com.usoftchina.saas.document.entities.Customer">
-    update customer
-    set cu_code = #{cu_code,jdbcType=VARCHAR},
-      cu_name = #{cu_name,jdbcType=VARCHAR},
-      cu_uu = #{cu_uu,jdbcType=VARCHAR},
-      cu_type = #{cu_type,jdbcType=VARCHAR},
-      cu_begindate = #{cu_begindate,jdbcType=TIMESTAMP},
-      cu_beginaramount = #{cu_beginaramount,jdbcType=DOUBLE},
-      cu_beginprerecamount = #{cu_beginprerecamount,jdbcType=DOUBLE},
-      cu_promisedays = #{cu_promisedays,jdbcType=DOUBLE},
-      cu_taxrate = #{cu_taxrate,jdbcType=DOUBLE},
-      cu_sellerid = #{cu_sellerid,jdbcType=INTEGER},
-      cu_sellercode = #{cu_sellercode,jdbcType=VARCHAR},
-      cu_sellername = #{cu_sellername,jdbcType=VARCHAR},
-      cu_credit = #{cu_credit,jdbcType=DOUBLE},
-      cu_status = #{cu_status,jdbcType=VARCHAR},
-      cu_statuscode = #{cu_statuscode,jdbcType=VARCHAR},
-      companyid = #{companyid,jdbcType=INTEGER},
-      updaterid = #{updaterid,jdbcType=INTEGER},
-      updatetime = #{updatetime,jdbcType=TIMESTAMP},
-      cu_text1 = #{cu_text1,jdbcType=VARCHAR},
-      cu_text2 = #{cu_text2,jdbcType=VARCHAR},
-      cu_text3 = #{cu_text3,jdbcType=VARCHAR},
-      cu_text4 = #{cu_text4,jdbcType=VARCHAR},
-      cu_text5 = #{cu_text5,jdbcType=VARCHAR},
-      cu_leftamount = #{cu_leftamount,jdbcType=DOUBLE},
-      cu_recamount = #{cu_recamount,jdbcType=DOUBLE},
-      cu_preamount = #{cu_preamount,jdbcType=DOUBLE},
-      cu_remark = #{cu_remark,jdbcType=VARCHAR}
-    where cu_id = #{id,jdbcType=INTEGER}
-  </update>
 
   <select id="validateCodeWhenInsert" resultType="int">
     select count(1) from customer where cu_code = #{code} and companyId =#{companyId}

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

@@ -244,5 +244,8 @@
     select count(*) from Employee where (em_code = #{code} or em_name = #{name}) and em_id !=#{id}  and companyId =#{companyId}
   </select>
 
+  <select id="selectByName" resultMap="BaseResultMap">
+    select * from employee where em_name = #{name} and companyId=#{companyId}
+  </select>
 
 </mapper>

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

@@ -476,6 +476,21 @@
         </where>
         ORDER BY PR_ID DESC
     </select>
+    <select id="selectReserveCostByIgnoreWarehouse" resultMap="ProdReserveCostResultMap">
+        select pr_code,pr_spec,pr_detail,pr_unit,sum(pw_onhand) pw_onhand,sum(pw_amount) pw_amount
+        from productWH tab left join Product on pw_prodcode=pr_code left join warehouse on pw_whid=wh_id
+        <where>
+            <if test="con!=null">
+                ${con}
+            </if>
+            <if test="companyId!=null">
+                and tab.companyId=#{companyId} and Product.companyId=#{companyId} and warehouse.companyId=#{companyId}
+                and pw_onhand!=0
+            </if>
+        </where>
+        group by pr_code,pr_spec,pr_detail,pr_unit,pr_id
+        ORDER BY PR_ID DESC
+    </select>
     <select id="getCountFromPurc" resultType="int">
         SELECT COUNT(*) FROM PURCHASEDETAIL
         WHERE PD_PRODID = #{id} AND COMPANYID=#{companyId}

+ 1 - 1
applications/money/money-server/src/main/java/com/usoftchina/saas/money/mapper/CustomerCheckViewMapper.java

@@ -10,6 +10,6 @@ import java.util.List;
 public interface CustomerCheckViewMapper {
     List<CustomerCheckView> selectByCondition(@Param("con") String con, @Param("companyId") Long companyId);
     String selectCalculateFields(@Param("fields") String fields, @Param("con") String con, @Param("companyId") Long companyId);
-    VendOrCustAdd selectCustAdd(@Param("sl_custid") Integer sl_vendid, @Param("sl_ym") Integer sl_ym, @Param("companyId") Long companyId);
+    VendOrCustAdd selectCustAdd(@Param("sl_custid") Integer sl_custid, @Param("cons") String cons, @Param("companyId") Long companyId);
     Integer getId(@Param("code") String code, @Param("companyId") Long companyId);
 }

+ 1 - 1
applications/money/money-server/src/main/java/com/usoftchina/saas/money/mapper/VendorAcountViewMapper.java

@@ -9,6 +9,6 @@ import java.util.List;
 public interface VendorAcountViewMapper {
     List<VendorAcountView> selectByCondition(@Param("con")String con, @Param("companyId")Long companyId);
     String selectCalculateFields(@Param("fields") String fields, @Param("con") String con, @Param("companyId") Long companyId);
-    VendOrCustAdd selectVendAdd(@Param("sl_vendid") Integer sl_vendid, @Param("sl_ym") Integer sl_ym, @Param("companyId") Long companyId);
+    VendOrCustAdd selectVendAdd(@Param("sl_vendid") Integer sl_vendid, @Param("cons") String cons, @Param("companyId") Long companyId);
     Integer getId(@Param("code") String code, @Param("companyId") Long companyId);
 }

+ 26 - 10
applications/money/money-server/src/main/java/com/usoftchina/saas/money/service/impl/MoneyReportServiceImpl.java

@@ -1,6 +1,7 @@
 package com.usoftchina.saas.money.service.impl;
 
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
 import com.usoftchina.saas.commons.dto.ListReqDTO;
@@ -91,6 +92,7 @@ public class MoneyReportServiceImpl implements MoneyReportService {
         List list = null;
         Long companyId = BaseContextHolder.getCompanyId();
         String con = req.getFinalCondition();
+        String cons = this.getDate(req.getCondition());
         String calculateFieldsSql = req.getCalculateFieldsSql();
         JSONArray arr = null;
         if (null == con) {
@@ -103,14 +105,12 @@ public class MoneyReportServiceImpl implements MoneyReportService {
             list = vendorAcountViewMapper.selectByCondition(con, companyId);
             if (list.size() >0) {
                 VendorAcountView vendorAcountView = (VendorAcountView) list.get(0);
+                //取时间
+
                 Integer vid = new Integer(0);
                 vid = vendorAcountViewMapper.getId(vendorAcountView.getPi_vendcode(), Long.valueOf(vendorAcountView.getCompanyId()));
-                Integer ym = Integer.valueOf(req.getYm());
-                VendOrCustAdd vendOrCustAdd = vendorAcountViewMapper.selectVendAdd(vid, ym, Long.valueOf(vendorAcountView.getCompanyId()));
+                VendOrCustAdd vendOrCustAdd = vendorAcountViewMapper.selectVendAdd(vid, cons, Long.valueOf(vendorAcountView.getCompanyId()));
                 if (vendOrCustAdd != null) {
-                    vendOrCustAdd.setNowbalance((vendOrCustAdd.getBeginamount() == null ? new Double(0) : vendOrCustAdd.getBeginamount())
-                            + (vendOrCustAdd.getNowamount() == null ? new Double(0) : vendOrCustAdd.getNowamount())
-                            - (vendOrCustAdd.getNowpay() == null ? new Double(0) : vendOrCustAdd.getNowpay()));
                     //封装成list
                     Map<String, Double> map1 = new HashMap<>();
                     map1.put("beginamount", vendOrCustAdd.getBeginamount());
@@ -154,12 +154,8 @@ public class MoneyReportServiceImpl implements MoneyReportService {
                 Integer vid = new Integer(0);
 
                 vid = customerCheckViewMapper.getId(customerCheckView.getPi_custcode(), Long.valueOf(customerCheckView.getCompanyId()));
-                Integer ym = Integer.valueOf(req.getYm());
-                VendOrCustAdd vendOrCustAdd = customerCheckViewMapper.selectCustAdd(vid, ym, Long.valueOf(customerCheckView.getCompanyId()));
+                VendOrCustAdd vendOrCustAdd = customerCheckViewMapper.selectCustAdd(vid, cons, Long.valueOf(customerCheckView.getCompanyId()));
                 if (vendOrCustAdd != null) {
-                    vendOrCustAdd.setNowbalance((vendOrCustAdd.getBeginamount() == null ? new Double(0) : vendOrCustAdd.getBeginamount())
-                            + (vendOrCustAdd.getNowamount() == null ? new Double(0) : vendOrCustAdd.getNowamount())
-                            - (vendOrCustAdd.getNowpay() == null ? new Double(0) : vendOrCustAdd.getNowpay()));
                     //封装成list
                     Map<String, Double> map1 = new HashMap<>();
                     map1.put("beginamount", vendOrCustAdd.getBeginamount());
@@ -200,4 +196,24 @@ public class MoneyReportServiceImpl implements MoneyReportService {
         }
         return map;
     }
+
+    public String getDate(String cons){
+        JSONArray jsonArray = JSONArray.parseArray(cons);
+        String con = " 1 = 1";
+        if (null != jsonArray && jsonArray.size() > 0) {
+            StringBuffer finalCondition = new StringBuffer();
+            for (int i = 0; i < jsonArray.size(); i++) {
+                JSONObject jsonObject = (JSONObject) jsonArray.get(i);
+                Object type = jsonObject.get("type");
+                if ("date".equals(type)){
+                    String value = (String) jsonObject.get("value");
+                    System.out.println("value" + value);
+                    value = value.replace(",", "' and '");
+                    con =  " a.sl_date between '" + value + "'" ;
+                    System.out.println("con"+con);
+                }
+            }
+        }
+        return con;
+    }
 }

+ 6 - 7
applications/money/money-server/src/main/resources/mapper/CustomerCheckViewMapper.xml

@@ -52,13 +52,12 @@
         <result column="nowpay" property="beginamount" jdbcType="DOUBLE" />
     </resultMap>
     <select id="selectCustAdd" resultMap="BaseAddMap">
-    select distinct a.sl_orderamount as beginamount, b.sl_orderamount as nowamount, c.sl_orderamount as nowpay FROM
-(select sl_orderamount,sl_custid,sl_ym, companyid from subledger where sl_kind = '期初余额') a
-left join (select sum(sl_orderamount) sl_orderamount,sl_custid,sl_ym from subledger where sl_kind = '出货单' or sl_kind = '销售退货单'
-group by sl_custid,sl_ym) b on a.sl_custid=b.sl_custid
-left join (select sum(sl_orderamount) sl_orderamount,sl_custid,sl_ym from subledger where sl_kind = '收款单' or sl_kind = '其他收入单'
-group by sl_custid,sl_ym) c on a.sl_custid=c.sl_custid
- where a.sl_custid=#{sl_custid,jdbcType=INTEGER} and a.sl_ym=#{sl_ym, jdbcType=INTEGER} and a.companyid = #{companyId}
+    select a.sl_orderamount as beginamount, b.nowamount, b.nowpay,(a.sl_orderamount +b.nowamount-b.nowpay) as nowbalance FROM
+    (select sl_orderamount,sl_custid,sl_date, companyid from subledger where sl_kind = '期初余额') a
+    left join (select sum(sl_amount) as nowamount,sum(sl_preamount) as nowpay,sl_custid,sl_date from subledger where sl_kind !='期初余额'
+    group by sl_custid,sl_date) b
+    on a.sl_custid=b.sl_custid
+    where a.sl_custid=#{sl_custid} and ${cons} and a.companyid = #{companyId} limit 1
   </select>
 
     <select id="getId" resultType="java.lang.Integer">

+ 6 - 7
applications/money/money-server/src/main/resources/mapper/VendorAcountViewMapper.xml

@@ -55,13 +55,12 @@
     <result column="nowpay" property="beginamount" jdbcType="DOUBLE" />
   </resultMap>
   <select id="selectVendAdd" resultMap="BaseAddMap">
-    select distinct a.sl_orderamount as beginamount, b.sl_orderamount as nowamount, c.sl_orderamount as nowpay FROM
-(select sl_orderamount,sl_vendid,sl_ym, companyid from subledger where sl_kind = '期初余额') a
-left join (select sum(sl_orderamount) sl_orderamount,sl_vendid,sl_ym from subledger where sl_kind = '采购验收单' or sl_kind = '采购验退单'
-group by sl_vendid,sl_ym) b on a.sl_vendid=b.sl_vendid
-left join (select sum(sl_orderamount) sl_orderamount,sl_vendid,sl_ym from subledger where sl_kind = '付款单' or sl_kind = '其他支出单'
-group by sl_vendid,sl_ym) c on a.sl_vendid=c.sl_vendid
- where a.sl_vendid=#{sl_vendid,jdbcType=INTEGER} and a.sl_ym=#{sl_ym, jdbcType=INTEGER} and a.companyid = #{companyId}
+    select a.sl_orderamount as beginamount, b.nowamount, b.nowpay,(a.sl_orderamount +b.nowamount-b.nowpay) as nowbalance FROM
+    (select sl_orderamount,sl_vendid,sl_date, companyid from subledger where sl_kind = '期初余额') a
+    left join (select sum(sl_amount) as nowamount,sum(sl_preamount) as nowpay,sl_vendid,sl_date from subledger where sl_kind !='期初余额'
+    group by sl_vendid,sl_date) b
+    on a.sl_vendid=b.sl_vendid
+    where a.sl_vendid=#{sl_vendid} and ${cons} and a.companyid = #{companyId} limit 1
   </select>
 
   <select id="getId" resultType="java.lang.Integer">

+ 1 - 1
applications/sale/sale-server/src/main/resources/config/application-docker-test.yml

@@ -4,7 +4,7 @@ eureka:
     prefer-ip-address: false
   client:
     serviceUrl:
-      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server-dev:8515/eureka/
+      defaultZone: http://${spring.security.user.name}:${spring.security.user.password}@saas-eureka-server-test:8515/eureka/
 spring:
   rabbitmq:
     virtual-host: test

+ 0 - 1
base-servers/gateway-server/src/main/resources/application.yml

@@ -186,7 +186,6 @@ auth:
     - /ws/**
     - /api/file/download
     - /api/commons/excel/import/templet
-    - /api/account/resource/url/list
   cookie:
     name: uid
     secret-key: 0taQcW073Z7G628g5H

+ 11 - 1
framework/core/src/main/java/com/usoftchina/saas/utils/DateUtils.java

@@ -543,9 +543,19 @@ public class DateUtils {
     //获取期间
     public static int getYm(Date date){
         String dates = date2String(date, "yyyyMM");
-//        dates = dates + "01";
         int d = Integer.parseInt(dates);
         return d;
     }
 
+    public static String plusDay(int num,String newDate) throws ParseException{
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+        Date currdate = format.parse(newDate);
+        Calendar ca = Calendar.getInstance();
+        ca.setTime(currdate);
+        ca.add(Calendar.DATE, num);// num为增加的天数,可以改变的
+        Date next = ca.getTime();
+        String enddate = format.format(next);
+        return enddate;
+    }
+
 }

+ 2 - 1
frontend/saas-portal-web/config/index.js

@@ -10,11 +10,12 @@ module.exports = {
     // Paths
     assetsSubDirectory: 'static',
     assetsPublicPath: '/',
-    proxyTable: {},
+    proxyTable: {}, 
 
     // Various Dev Server settings
     // host: 'localhost', // can be overwritten by process.env.HOST
     host: '127.0.0.1', // can be overwritten by process.env.HOST
+    // host: '192.168.253.183', // can be overwritten by process.env.HOST
     port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
     autoOpenBrowser: false,
     errorOverlay: true,

+ 2 - 2
frontend/saas-portal-web/src/components/conenter/home.vue

@@ -261,10 +261,10 @@
       }
     },
     created(){
-      if (this.$route.query.isporblem == undefined) {
+      if (this.$route.params.isporblem == undefined) {
         this.isproblem = true
       } else {
-        this.isproblem = this.$route.query.isporblem
+        this.isproblem = this.$route.params.isporblem
       }
         this.$ajax({
           url: this.$url.api+'/api/auth/info',

+ 42 - 10
frontend/saas-portal-web/src/components/conenter/problem.vue

@@ -9,16 +9,16 @@
               <div class="bz-box">
                 <div class="bz-sskuang">
                   <span><img class="bz-sousuoimg" src="/static/img/assets/sou.png" alt=""></span>
-                  <input class="bz-sousuo" type="text" placeholder="请输入标题搜索"/>
+                  <input class="bz-sousuo" type="text" placeholder="请输入标题搜索" v-model="searchVal"/>
                 </div>
                 <button class="bz-btn">搜索</button>
               </div>
               <div class="bz-right-conent">
                 <ul>
-                  <li v-for="(d , i) in arr" :key="i">
+                  <li v-for="(d , i) in list" :key="i">
                     <div class="over Text-title" @click="shows(d,i)">
                       <span class="left bz-yuandian"></span>
-                      <span class="left">{{d.title}}</span>
+                      <span ref="txttitle" class="left bz-txttitle">{{d.title}}</span>
                       <img  class="right bz-copy" :class="d.isshow ? 'rotates' : 'norotate'" src="/static/img/Triangle Copy 4.png" alt="">
                     </div>
                     <div ref="title" class="Text-content" :class="d.isshow ? 'dispays' : 'hides'">
@@ -38,18 +38,45 @@
         data(){
           return {
             arr:[
-              {isshow: true, title:'方式不同吧好像是差不多',centent:'警方圣诞快乐JFK的实力积分积分累积角度考虑实际疯狂的世界佛教埃及空军看见反抗类毒素解放就'},
-              {isshow: false, title:'上的换个环境操作文档',centent:'警方圣诞K的实力积分积分累积角度狂的世界佛教埃及空军看见反抗类毒素解放就'},
-              {isshow: false, title:'房贷首付操作文档',centent:'警方圣诞快分积分累积角度考虑实际疯狂的世界佛教埃及空军看见反抗类毒素解放就'},
-            ]
+              {isshow: true, title:'1、如何注册开通优企云服?',centent:'警方圣诞快乐JFK的实力积分积分累积角度考虑实际疯狂的世界佛教埃及空军看见反抗类毒素解放就'},
+              {isshow: false, title:'2、实际送货数量大于采购单数量如何操作?',centent:'答:若超出部份正好是贵司所需, 按实际收货数量修改采购验收数量(应付款是按已审核的采购验收单金额记账的'},
+              {isshow: false, title:'3、为什么新增采购单据时有的物料可自动带出单价, 有的不能?',centent:'答:因为采购单中的单价取的是物料资料中的最新采购单价, 而最新采购单价是采购验收单审核后自动更新至物料资料中的。'},
+              {isshow: false, title:'4、采购单分批次交货时,如何操作? 采购单界面点“转验收单”按钮时会将采购单中的所有都转过去。',centent:'答:采购验收单中可修改数量, 也可删除明细行。 删除后再次收货时在采购单界面点“转验收单”按钮时生成的采购验收单会显示之前删除的那行数据(即所有未交部份均可再显示)'},
+              {isshow: false, title:'5、以销代购业务在系统如何操作?即收到客户订单后再采购的业务模式。',centent:'答:销售订单界面点“转采购”按钮。'},
+              {isshow: false, title:'6、人员如何分配权限?',centent:'答:快捷方法是在【账户设置】中添加角色,一个账号可充当多个角色且权限是叠加的;也可新增角色自定义分配权限。'},
+              {isshow: false, title:'7、人员离职后如何限制不能再登陆系统?',centent:'答:在【系统管理】中的账户设置中将该账户关闭。'},
+              {isshow: false, title:'8、制造单中的类型可否新增?',centent:'答:不可以。下拉选项为组装与拆件两种。组装即领料生产成品入库, 拆件即将成品拆解成原材料与半成品。'},
+              {isshow: false, title:'9、制造单如何完工与发料?',centent:'答:制造单类型为组装,审核时系统会自动生成原材料的领料单与成品的完工入库单;类型为拆件,审核时会自动生成成品的拆件领料单与原材料的完工入库单'},
+              {isshow: false, title:'10、采购单不需要再交货时要如何操作?',centent:'答:进入采购单列表将该采购单关闭即可。'},
+              {isshow: false, title:'11、新使用系统时如何处理之前的PO?',centent:'答:将未交货的采购单PO 中待交货的数量当作新系统中的采购数量按原采购单号补入系统。'},
+              {isshow: false, title:'12、已交货的采购单没有录入新系统,有退货如何处理?',centent:'答:新增采购验退单, 在备注中写明原PO号。'},
+              {isshow: false, title:'13、单据日期是否可修改? 如今天录单可否将单据日期改为明天?',centent:'答:可以。只要当月没有结账。'},
+              {isshow: false, title:'14、发现上个月有张单据做错了, 可否修改?',centent:'答:若上个月已结账,不允许修改,可本月做其它出入库单据补账, 或请财务人员反结账到上个月,修改后再结账'},
+              {isshow: false, title:'15、供应商录入时将期初应付录错了,到月底对账才发现,怎么办?',centent:'答:可用其它应付平账, 或反审单据,修改期初应付后再审核业务单据。'},
+            ],
+            searchVal:'', //默认输入为空
           }
         },
         methods: {
+          //点击展开
           shows(d,i){
-            d.isshow = !d.isshow
+            d.isshow = !d.isshow;
             let textH =  this.$refs.text[i].offsetHeight;
-            this.$refs.title[i].style.height = textH + 'px'
-          }
+            this.$refs.title[i].style.height = textH + 'px';
+          },
+        },
+        //通过计算属性过滤数据
+        computed:{
+            list: function(){
+                var arrByZM = [];
+                for (var i=0;i<this.arr.length;i++){
+                    if(this.arr[i].title.search(this.searchVal) != -1){
+                        //判断输入框中的值是否可以匹配到数据,如果匹配成功添加到数组
+                        arrByZM.push(this.arr[i]);
+                    }
+                }
+                return arrByZM;
+            }
         }
     }
 </script>
@@ -131,4 +158,9 @@
     -moz-transition: All 0.4s ease-in-out;
     -o-transition: All 0.4s ease-in-out;
 }
+.bz-txttitle {
+  width: 90%;
+  padding-left: 22px;
+  text-indent: -22px;
+}
 </style>

+ 1 - 1
frontend/saas-portal-web/src/components/footer/footer.vue

@@ -65,7 +65,7 @@
 		},
 		methods:{
 			problem(){
-				this.$router.push({path: '/name', query: {isporblem: false}})
+				this.$router.push({name: 'Home', params: {isporblem: false}})
 				this.$store.commit("problemfalse")
 				document.documentElement.scrollTop = 0;
 			}

+ 0 - 4
frontend/saas-portal-web/static/css/main.css

@@ -151,7 +151,6 @@ main > section {
 }
 .ts-box {
     overflow: hidden;
-    /* margin-top: 50px; */
     position: relative;
     padding: 150px 0;
     width: 98%;
@@ -163,9 +162,6 @@ main > section {
 .ts-boximg img {
     width: 65%;
 }
-.ts-lefttext p {
-    text-align: right;
-}
 .ts-title {
     font-family: PingFangSC-Regular !important;
     color: #0D253E !important;

+ 37 - 64
frontend/saas-web/app.json

@@ -275,6 +275,39 @@
         "cacheParam": "_dc"
     },
 
+    "builds": {
+        "dev": {
+            "server": {
+                "accountCenter":"http://192.168.0.181:8000",
+                "accountEnterprise":"http://192.168.0.181:8000/#/enterprise",
+                "basePath": {
+                    "https": "https://saas-api-dev.usoftchina.com:5443",
+                    "http": "http://192.168.0.181:8560"
+                },
+                "urlPattern": "^\/api\/"
+            }
+        },
+        "test": {
+            "server": {
+                "accountCenter": "https://saas-test.usoftchina.com:5443",
+                "accountEnterprise": "https://saas-test.usoftchina.com:5443/#/enterprise",
+                "basePath": {
+                    "https": "https://saas-api-test.usoftchina.com:5443",
+                    "http": "http://192.168.0.181:8575"
+                },
+                "urlPattern": "^\/api\/"
+            }
+        },
+        "prod": {
+            "server": {
+                "accountCenter":"https://saas.usoftchina.com",
+                "accountEnterprise":"https://saas.usoftchina.com/#/enterprise",
+                "basePath": "https://saas-api.usoftchina.com",
+                "urlPattern": "^\/api\/"
+            }
+        }
+    },
+
     /**
      * Settings specific to production builds.
      */
@@ -293,12 +326,6 @@
         },
         "compressor": {
             "type": "yui"
-        },
-        "server": {
-            "accountCenter":"https://saas.usoftchina.com",
-            "accountEnterprise":"https://saas.usoftchina.com/#/enterprise",
-            "basePath": "https://saas-api.usoftchina.com",
-            "urlPattern": "^\/api\/"
         }
     },
 
@@ -306,68 +333,14 @@
      * Settings specific to testing builds.
      */
     "testing": {
-        "output": {
-            "appCache": {
-                "enable": true,
-                "path": "cache.appcache"
-            }
-        },
-        "loader": {
-            "cache": "${build.timestamp}"
-        },
-        "cache": {
-            "enable": true
-        },
-        "compressor": {
-            "type": "yui"
-        },
-        "server": {
-            /** 暂时更改
-            "accountCenter": "https://saas-test.usoftchina.com:5443",
-            "accountEnterprise": "https://saas-test.usoftchina.com:5443/#/enterprise",
-            "basePath": {
-                "https": "https://saas-api-test.usoftchina.com:5443",
-                "http": "http://192.168.0.181:8575"
-            },
-            "urlPattern": "^\/api\/"
-            **/
-            "accountCenter":"http://192.168.0.181:8000",
-            "accountEnterprise":"http://192.168.0.181:8000/#/enterprise",
-            "basePath": {
-                "https": "https://saas-api-dev.usoftchina.com:5443",
-                "http": "http://192.168.0.181:8560"
-            },
-            "urlPattern": "^\/api\/"
-        }
     },
 
     /**
      * Settings specific to development builds.
      */
     "development": {
-        "output": {
-            "appCache": {
-                "enable": true,
-                "path": "cache.appcache"
-            }
-        },
-        "loader": {
-            "cache": "${build.timestamp}"
-        },
-        "cache": {
-            "enable": true
-        },
-        "compressor": {
-            "type": "yui"
-        },
-        "server": {
-            "accountCenter":"http://192.168.0.181:8000",
-            "accountEnterprise":"http://192.168.0.181:8000/#/enterprise",
-            "basePath": {
-                "https": "https://saas-api-dev.usoftchina.com:5443",
-                "http": "http://192.168.0.181:8560"
-            },
-            "urlPattern": "^\/api\/"
+        "watch": {
+            "delay": 250
         }
     },
 
@@ -422,7 +395,7 @@
      *          "css": "${app.output.resources}/${app.name}-all.css",
      *          "js": {
      *              "path": "app.js",
-     *              // This setting constrols the output language level.  Set to 'ES6' to 
+     *              // This setting constrols the output language level.  Set to 'ES6' to
      *              // disable the transpiler
      *              "version": "ES5"
      *          },
@@ -563,4 +536,4 @@
      * Normally you should never change this value.
      */
     "id": "a20e1670-7932-41f6-8e9c-55b77cba3f26"
-}
+}

+ 4 - 0
frontend/saas-web/app/Application.scss

@@ -297,6 +297,10 @@ body.launching {
   border-color: #ABDAFF;
 }
 
+.x-keyboard-mode  .x-grid-item-focused .x-grid-cell-inner:before {
+  border: none;
+}
+
 .x-grid-item-over {
   background-color: #bde5f7;
 }

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

@@ -16,14 +16,14 @@ Ext.define('saas.view.core.dbfind.types.BankInfoDbfindTrigger', {
         width: 200
     }],
     dbSearchFields: [{
-        emptyText: '查找资金账户',
+        emptyText: '输入资金账户或名称',
         xtype: "textfield",
         name: "search",
         getCondition: function (v) {
             return "(upper(bk_bankcode) like '%" + v.toUpperCase() + "%' or upper(bk_bankname) like '%" + v.toUpperCase() + "%')";
         },
         allowBlank: true,
-        columnWidth: 0.25
+        width:300       
     }],
     dbColumns: [{
         text: "账户ID",

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

@@ -25,7 +25,7 @@ Ext.define('saas.view.core.dbfind.types.CustomerDbfindTrigger', {
             return "(upper(cu_code) like '%" + v.toUpperCase() + "%' or upper(cu_name) like '%" + v.toUpperCase() + "%')";
         },
         allowBlank: true,
-        columnWidth: 0.25
+        width:300
     }],
     dbColumns: [{
         conditionCode: 'id',

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

@@ -24,7 +24,7 @@ Ext.define('saas.view.core.dbfind.types.EmployeeDbfindTrigger', {
             return "(upper(em_code) like '%"+v.toUpperCase()+"%' or upper(em_name) like '%"+v.toUpperCase()+"%')";
         },
         allowBlank : true, 
-        columnWidth : 0.25
+        width:300
     }],
     //放大镜窗口列表
     dbColumns:[{

+ 1 - 11
frontend/saas-web/app/view/core/dbfind/types/OriOrderMutiDbfindTrigger.js

@@ -12,16 +12,6 @@ Ext.define('saas.view.core.dbfind.types.OriOrderMutiDbfindTrigger', {
         field: 'sl_code',
         width: 150
     }],
-    dbSearchFields: [{
-        emptyText: '查找资金账户',
-        xtype: "textfield",
-        name: "search",
-        getCondition: function (v) {
-            return "(upper(bk_bankcode) like '%" + v.toUpperCase() + "%' or upper(bk_bankname) like '%" + v.toUpperCase() + "%')";
-        },
-        allowBlank: true,
-        columnWidth: 0.25
-    }],
     dbSearchFields:[{
         emptyText:'输入源单编号',
         xtype : "textfield",
@@ -30,7 +20,7 @@ Ext.define('saas.view.core.dbfind.types.OriOrderMutiDbfindTrigger', {
             return "(upper(sl_code) like '%"+v.toUpperCase()+"%')";
         },
         allowBlank : true,
-        columnWidth : 0.25
+        columnWidth : 300
     }],
     dbColumns:[{
         "text": "源单id",

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

@@ -23,7 +23,7 @@ Ext.define('saas.view.core.dbfind.types.ProductDbfindTrigger', {
             return "(upper(pr_spec) like '%" + v.toUpperCase()+"%' or upper(pr_code) like '%"+v.toUpperCase()+"%' or upper(pr_detail) like '%"+v.toUpperCase()+"%')";
         },
         allowBlank : true, 
-        columnWidth : 0.25
+        columnWidth :300
     }],
     dbColumns:[{
         text: "物料ID",

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

@@ -26,7 +26,7 @@ Ext.define('saas.view.core.dbfind.types.ProductMultiDbfindTrigger', {
         xtype: "textfield",
         name: "search",
         allowBlank: true,
-        columnWidth: 0.25,
+        width:300,
         getCondition: function (v) {
             return "(upper(pr_code) like '%" + v.toUpperCase() + "%' or upper(pr_detail) like '%" + v.toUpperCase() + "%' or upper(pr_spec) like '%" + v.toUpperCase() + "%')";
         }

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

@@ -25,7 +25,7 @@ Ext.define('saas.view.core.dbfind.types.VendorDbfindTrigger', {
             return "(upper(ve_code) like '%"+v.toUpperCase()+"%' or upper(ve_name) like '%"+v.toUpperCase()+"%')";
         },
         allowBlank : true, 
-        columnWidth : 0.25
+        width:300
     }],
     //放大镜窗口列表
     dbColumns:[{

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

@@ -22,7 +22,7 @@ Ext.define('saas.view.core.dbfind.types.WarehouseDbfindTrigger', {
         xtype: "textfield",
         name: "wh_code",
         allowBlank: true,
-        columnWidth: 0.25,
+        width:300,
         getCondition: function (v) {
             return "(upper(wh_code) like '%" + v.toUpperCase() + "%' or upper(wh_description) like '%" + v.toUpperCase() + "%')";
         }

+ 0 - 1
frontend/saas-web/app/view/core/form/field/DetailGridField.js

@@ -57,7 +57,6 @@ Ext.define('saas.view.core.form.field.DetailGridField', {
             }],
             normalViewConfig: {
                 deferEmptyText: false,
-                emptyText: '无数据',
             },
             lockedViewConfig: {
                 scrollable: {

+ 0 - 1
frontend/saas-web/app/view/core/query/QueryGridPanel.js

@@ -63,7 +63,6 @@ Ext.define('saas.view.core.query.QueryGridPanel', {
         Ext.apply(me, {
             viewConfig: {
                 deferEmptyText: false,
-                emptyText: '无数据'
             },
             columns: me.initColumns(),
             store: Ext.create('Ext.data.Store', {

+ 27 - 8
frontend/saas-web/app/view/core/report/ReportPanel.js

@@ -22,9 +22,14 @@ Ext.define('saas.view.core.report.ReportPanel', {
     searchItems: [], // 查询字段
     reportTitle: '报表',
     autoLoad:true,
+    printAble: true,
+    exportAble: true,
+    queryMode: 'DETAIL',
 
     initComponent: function() {
         var me = this;
+        var printAble = me.printAble;
+        var exportAble = me.exportAble;
         var store = me.initStore();
         columnWidth: 0.25,
         Ext.apply(me, {
@@ -49,6 +54,7 @@ Ext.define('saas.view.core.report.ReportPanel', {
                     },{
                         xtype:'button',
                         text:'打印',
+                        hidden: !printAble,
                         style: {
                             float: 'right'
                         },
@@ -65,6 +71,7 @@ Ext.define('saas.view.core.report.ReportPanel', {
                             float: 'right'
                         },
                         text: '导出',
+                        hidden: !exportAble,
                         menu: {
                             defaults: {
                                 handler: 'exportTo'
@@ -163,7 +170,6 @@ Ext.define('saas.view.core.report.ReportPanel', {
                 }],
                 viewConfig: {
                     deferEmptyText: false,
-                    emptyText: '无数据',
                     listeners: {
                         itemcontextmenu: function(view, rec, node, index, e) {
                             e.stopEvent();
@@ -283,7 +289,7 @@ Ext.define('saas.view.core.report.ReportPanel', {
                     var params = me.applyParams({
                         number: store.exportNumber?store.exportNumber:op._page,
                         size: store.exportPageSize?store.exportPageSize:store.pageSize,
-                        mode: 'DETAIL',
+                        mode: me.queryMode || 'DETAIL',
                         condition: JSON.stringify(condition),
                         calculateFields: JSON.stringify(summarys)
                     });
@@ -378,6 +384,7 @@ Ext.define('saas.view.core.report.ReportPanel', {
 
     initSearchItems: function() {
         var me = this,
+        queryItems = [],
         items = me.searchItems,
         viewModel = me.getViewModel();
 
@@ -392,6 +399,10 @@ Ext.define('saas.view.core.report.ReportPanel', {
                 item.beforeLabelTextTpl = "<font color=\"red\" style=\"position:relative; top:2px;right:2px; font-weight: bolder;\">*</font>";
             }
 
+            if(!ignore) {
+                queryItems.push(name);
+            }
+
             if(item.xtype == 'numberfield') {
                 Ext.applyIf(item, {
                     hideTrigger: true, // 隐藏trigger
@@ -427,7 +438,8 @@ Ext.define('saas.view.core.report.ReportPanel', {
                             if(!th.fireEvent('beforequery', th)) {
                                 return;
                             }else {
-                                me.getController().onQuery()
+                                var p = this.up('core-report-reportpanel');
+                                p.getController().onQuery()
                             }
                         }
                     }
@@ -435,6 +447,8 @@ Ext.define('saas.view.core.report.ReportPanel', {
             });
         });
 
+        me.queryItems = queryItems;
+
         return items;
     },
 
@@ -444,26 +458,31 @@ Ext.define('saas.view.core.report.ReportPanel', {
         formItems = form.items.items,
         viewModel = me.getViewModel(),
         viewModelData = viewModel.getData(),
-        bindItems = viewModelData['form'],
+        formData = viewModelData['form'] || {},
+        queryItems = me.queryItems,
         condition,
         conditions = [];
 
-        for(k in bindItems) {
+        for(var i = 0; i < queryItems.length; i++) {
+            var n = queryItems[i];
             var item = Ext.Array.findBy(formItems, function(i) {
-                return i.name == k;
+                return i.name == n;
             });
             var field = item.name,
             func = item.getCondition,
-            value = bindItems[k],
+            value = formData[n],
             condition;
 
+            if(!value) {
+                continue;
+            }
+
             if(typeof func == 'function') {
                 condition = {
                     type: 'condition',
                     value: func(value)
                 }
             }else {
-                // var xtype = item.xtype || 'textfield',
                 type = item.fieldType || me.getDefaultFieldType(item),
                 operation = item.operation || me.getDefaultFieldOperation(item),
                 conditionValue = me.getConditionValue(item, value);

+ 4 - 0
frontend/saas-web/app/view/document/customer/BasePanel.js

@@ -81,6 +81,10 @@ Ext.define('saas.view.document.customer.BasePanel', {
             text : "客户编号", 
             width : 150.0, 
             dataIndex : "cu_code"
+        },{
+            text : "客户简称", 
+            width : 150.0, 
+            dataIndex : "cu_shortname"
         }, 
         {
             text : "客户名称", 

+ 7 - 1
frontend/saas-web/app/view/document/customer/FormPanel.js

@@ -34,12 +34,18 @@ Ext.define('saas.view.document.customer.FormPanel', {
         fieldLabel: '客户编号',
         allowBlank: false,
         columnWidth: 0.25
+    },{
+        xtype: 'textfield',
+        name: 'cu_shortname',
+        fieldLabel: '客户简称',
+        allowBlank: true,
+        columnWidth: 0.25
     },{
         xtype: 'textfield',
         name: 'cu_name',
         fieldLabel: '客户名称',
         allowBlank: false,
-        columnWidth: 0.5
+        columnWidth: 0.25
     },{
         editable:false,
         xtype : "remotecombo", 

+ 31 - 31
frontend/saas-web/app/view/document/product/BasePanel.js

@@ -11,21 +11,19 @@ Ext.define('saas.view.document.product.BasePanel', {
     searchField:[{
         xtype : "textfield", 
         name : "pr_code", 
-        width:150, 
-        emptyText:'编号'
-    }, {
-        xtype : "textfield", 
-        name : "pr_detail", 
-        width:150, 
-        emptyText:'名称'
-    }, {
+        width:300, 
+        emptyText:'输入物料编号、名称、型号或规格',
+        getCondition: function (v) {
+            return "(upper(CONCAT(pr_code,'#',pr_detail,'#',pr_spec,'#',pr_orispeccode)) like '%" + v.toUpperCase() + "%')";
+        },
+    },{
         editable:true,
         hiddenBtn:true,
         xtype : "remotecombo", 
         storeUrl: '/api/document/producttype/getCombo',
         name : "pr_kind", 
         emptyText : "物料类型",
-        width:110,
+        width:120,
     }, {
         xtype : "textfield", 
         name : "pr_brand", 
@@ -81,42 +79,46 @@ Ext.define('saas.view.document.product.BasePanel', {
             text : "物料编号", 
             dataIndex : "pr_code", 
             width : 150.0
+        }, {
+            text : "类型", 
+            dataIndex : "pr_kind", 
+            width : 110.0
         }, {
             text : "物料名称", 
             dataIndex : "pr_detail", 
             width : 200.0
+        }, {
+            text : "型号", 
+            dataIndex : "pr_orispeccode", 
+            width : 150.0
         }, {
             text : "规格", 
             dataIndex : "pr_spec", 
             width : 150.0
-        }, {
-            text : "类型", 
-            dataIndex : "pr_kind", 
-            width : 110.0
-        }, {
-            text : "单位", 
-            dataIndex : "pr_unit", 
-            width : 80.0 
-        }, {
+        },{
             text : "品牌", 
             dataIndex : "pr_brand", 
             width : 110.0 
-        }, {
-            text : "库存", 
+        },  {
+            text : "库存", 
             dataIndex : "po_onhand",
             xtype: 'numbercolumn',
-            width : 110.0,
+            width : 120.0,
             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 : "单位", 
+            dataIndex : "pr_unit", 
+            width : 80.0 
         }, {
-            text : "标准单价", 
+            text : "标准定价(元)", 
             dataIndex : "pr_standardprice",
             xtype: 'numbercolumn',
-            width : 110.0,
+            width : 130.0,
             renderer : function(v) {
                 var arr = (v + '.').split('.');
                 var xr = (new Array(arr[1].length > 8 ? 8 : arr[1].length)).fill('0');
@@ -124,29 +126,27 @@ Ext.define('saas.view.document.product.BasePanel', {
                 return Ext.util.Format.number(v, format);
             }
         }, {
-            text : "最新采购价", 
+            text : "最新采购价(元)", 
             dataIndex : "pr_purcprice",
             xtype: 'numbercolumn',
-            width : 110.0,
+            width : 140.0,
             renderer : function(v) {
                 var arr = (v + '.').split('.');
                 var xr = (new Array(arr[1].length > 8 ? 8 : arr[1].length)).fill('0');
                 var format = '0.' + xr.join();
                 return Ext.util.Format.number(v, format);
-            }, 
-            width : 200.0, 
+            }
         }, {
-            text : "最新出库价", 
+            text : "最新售价(元)", 
             dataIndex : "pr_saleprice",
             xtype: 'numbercolumn',
-            width : 110.0,
+            width : 120.0,
             renderer : function(v) {
                 var arr = (v + '.').split('.');
                 var xr = (new Array(arr[1].length > 8 ? 8 : arr[1].length)).fill('0');
                 var format = '0.' + xr.join();
                 return Ext.util.Format.number(v, format);
-            }, 
-            width : 200.0, 
+            }
         }, {
             text : "备注", 
             dataIndex : "pr_text1",

+ 0 - 1
frontend/saas-web/app/view/home/InfoCard.scss

@@ -21,7 +21,6 @@ $max-card-width: 235px;
                         padding: 16px;
                         height: 120px;
                         border-radius: 0.5rem;
-                        box-shadow: 0 0 1px rgba(0,0,0,.125), 0 1px 3px rgba(0,0,0,.2);
                         position: relative;
                         display: block;
                         cursor: pointer;

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

@@ -141,19 +141,19 @@ Ext.define('saas.view.money.report.CustomerCheckCheck', {
         width: 0,
         summaryType: 'cus',
     }, {
-        text: '本期发生',
+        text: '增加应收',
         dataIndex: 'nowamount',
         hidden: true,
         width: 0,
         summaryType: 'cus',
     }, {
-        text: '本期收款',
+        text: '增加预收',
         dataIndex: 'nowpay',
         hidden: true,
         width: 0,
         summaryType: 'cus',
     }, {
-        text: '本期结余',
+        text: '应收余额',
         dataIndex: 'nowbalance',
         hidden: true,
         width: 0,

+ 63 - 0
frontend/saas-web/app/view/money/report/TotalPayDetail.js

@@ -0,0 +1,63 @@
+/**
+ * 应付总账
+ */
+Ext.define('saas.view.money.report.TotalPayDetail', {
+    extend: 'saas.view.core.report.ReportPanel',
+    xtype: 'monry-report-totalpaydetail',
+
+    controller: 'money-report-totalpaydetail',
+    viewModel: 'money-report-totalpaydetail',
+
+    viewName: 'money-report-totalpaydetail',
+
+    groupField: null,
+    listUrl: '/api/money/report/vendormonthdetails',
+    // listUrl: 'http://192.168.253.139:8560/api/money/report/vendormonthdetails',
+    defaultCondition: null,
+    reportTitle: '应收总账明细表',
+    QueryWidth: 0.5,
+    searchItems: [{
+        xtype: 'textfield',
+        name: 'vm_vendcode',
+        emptyText: '供应商编号/名称',
+        columnWidth: 0.25,
+        getCondition: function(v) {
+            return "(upper(vm_vendcode) like '%"+v.toUpperCase()+"%' or upper(vm_vendname) like '%"+v.toUpperCase()+"%')";
+        },
+    }, {
+        xtype: 'monthdatefield',
+        name: 'vm_yearmonth',
+        emptyText: '期间',
+        columnWidth: 0.25
+    }],
+
+    reportColumns: [{
+        text: '供应商编号',
+        dataIndex: 'vm_vendcode',
+        width: 200
+    }, {
+        text: '供应商名称',
+        dataIndex: 'vm_vendname',
+        width: 200,
+    }, {
+        text: '期初应付',
+        xtype: 'numbercolumn',
+        dataIndex: 'vm_beginamount',
+        width: 150
+    }, {
+        text: '增加应付',
+        xtype: 'numbercolumn',
+        dataIndex: 'vm_nowamount',
+        width: 150
+    }, {
+        text: '增加预付',
+        xtype: 'numbercolumn',
+        dataIndex: 'vm_nowpreamount',
+        width: 150
+    }, {
+        text: '应付余额',
+        dataIndex: 'vm_endamount',
+        xtype: 'numbercolumn',
+        width: 150,
+    }]
+});

+ 4 - 0
frontend/saas-web/app/view/money/report/TotalPayDetailController.js

@@ -0,0 +1,4 @@
+Ext.define('saas.view.money.report.TotalPayDetailController', {
+    extend: 'saas.view.core.report.ReportPanelController',
+    alias: 'controller.money-report-totalpaydetail',
+});

+ 5 - 0
frontend/saas-web/app/view/money/report/TotalPayDetailModel.js

@@ -0,0 +1,5 @@
+Ext.define('saas.view.money.report.TotalPayDetailModel', {
+    extend: 'saas.view.core.report.ReportPanelModel',
+    alias: 'viewmodel.money-report-totalpaydetail',
+
+});

+ 62 - 0
frontend/saas-web/app/view/money/report/TotalRecDetail.js

@@ -0,0 +1,62 @@
+/**
+ * 应收总账
+ */
+Ext.define('saas.view.money.report.TotalRecDetail', {
+    extend: 'saas.view.core.report.ReportPanel',
+    xtype: 'monry-report-totalrecdetail',
+
+    controller: 'money-report-totalrecdetail',
+    viewModel: 'money-report-totalrecdetail',
+
+    viewName: 'money-report-totalrecdetail',
+
+    groupField: null,
+    listUrl: '/api/money/report/custormonthdetails',
+    // listUrl: 'http://192.168.253.139:8560/api/money/report/custormonthdetails',
+    defaultCondition: null,
+    reportTitle: '应收总账明细表',
+    QueryWidth: 0.5,
+    searchItems: [{
+        xtype: 'textfield',
+        name: 'cm_custcode',
+        emptyText: '客户编号/名称',
+        columnWidth: 0.25,
+        getCondition: function (v) {
+            return "(upper(cm_custcode) like '%" + v.toUpperCase() + "%' or upper(cm_custname) like '%" + v.toUpperCase() + "%')";
+        },
+    }, {
+        xtype: 'monthdatefield',
+        name: 'cm_yearmonth',
+        fieldLabel: '期间',
+        columnWidth: 0.25
+    }],
+
+    reportColumns: [{
+        text: '客户编号',
+        dataIndex: 'cm_custcode',
+        width: 200
+    }, {
+        text: '客户名称',
+        dataIndex: 'cm_custname',
+        width: 200,
+    }, {
+        text: '期初应收',
+        dataIndex: 'cm_beginamount',
+        width: 150
+    }, {
+        text: '增加应收',
+        xtype: 'numbercolumn',
+        dataIndex: 'cm_nowamount',
+        width: 150
+    }, {
+        text: '增加预收',
+        xtype: 'numbercolumn',
+        dataIndex: 'cm_nowpreamount',
+        width: 150
+    }, {
+        text: '应收余额',
+        dataIndex: 'cm_endamount',
+        xtype: 'numbercolumn',
+        width: 150,
+    }]
+});

+ 19 - 0
frontend/saas-web/app/view/money/report/TotalRecDetailController.js

@@ -0,0 +1,19 @@
+Ext.define('saas.view.money.report.TotalRecDetailController', {
+    extend: 'saas.view.core.report.ReportPanelController',
+    alias: 'controller.money-report-totalrecdetail',
+    init: function (form) {
+        this.control({
+            // 供应商编号
+            'dbfindtrigger[name=pi_vendname]':{
+                beforerender:function(f){
+                    Ext.apply(f,{
+                        dbfinds:[{
+                            from:'ve_name',to:'pi_vendname'
+                        }],
+                    }) ;
+
+                }
+            }
+        });
+    }
+});

+ 6 - 0
frontend/saas-web/app/view/money/report/TotalRecDetailModel.js

@@ -0,0 +1,6 @@
+Ext.define('saas.view.money.report.TotalRecDetailModel', {
+    extend: 'saas.view.core.report.ReportPanelModel',
+    alias: 'viewmodel.money-report-totalrecdetail',
+
+
+});

+ 3 - 3
frontend/saas-web/app/view/money/report/VendorCheck.js

@@ -149,19 +149,19 @@ Ext.define('saas.view.money.report.VendorCheck', {
         width: 0,
         summaryType: 'cus',
     }, {
-        text: '本期发生',
+        text: '增加应付',
         dataIndex: 'nowamount',
         hidden: true,
         width: 0,
         summaryType: 'cus',
     }, {
-        text: '本期付款',
+        text: '增加预付',
         dataIndex: 'nowpay',
         hidden: true,
         width: 0,
         summaryType: 'cus',
     }, {
-        text: '本期结余',
+        text: '应付余额',
         dataIndex: 'nowbalance',
         hidden: true,
         width: 0,

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

@@ -320,23 +320,24 @@ Ext.define('saas.view.purchase.purchase.FormPanel', {
     }, {
         xtype : "textfield", 
         name : "pu_total", 
-        fieldLabel : "单据金额",
+        fieldLabel : "采购金额",
         readOnly:true,
         columnWidth : 0.25,
     },{
-        xtype : "employeeDbfindTrigger", 
+        xtype : "hidden", 
         name : "pu_buyercode", 
-        fieldLabel : "采购员编号",
+        fieldLabel : "采购员编号"
     },{
-        xtype : "textfield", 
+        xtype : "employeeDbfindTrigger", 
         name : "pu_buyername", 
         fieldLabel : "采购员",
         columnWidth : 0.25,
-        readOnly:true
+        defaultValue:saas.util.BaseUtil.getCurrentUser().realname
     },{
         xtype : "hidden", 
         name : "pu_buyerid", 
-        fieldLabel : "采购员ID"
+        fieldLabel : "采购员ID",
+        defaultValue:saas.util.BaseUtil.getCurrentUser().id
     },
     {
         xtype : "hidden", 

+ 1 - 1
frontend/saas-web/app/view/purchase/purchase/FormPanelController.js

@@ -20,7 +20,7 @@ Ext.define('saas.view.purchase.purchase.FormPanelController', {
                 }
             },
             // 主表-采购员名称
-            'dbfindtrigger[name=pu_buyercode]':{
+            'dbfindtrigger[name=pu_buyername]':{
                 beforerender:function(f){
                     Ext.apply(f,{
                         //赋值 

+ 2 - 0
frontend/saas-web/app/view/purchase/purchaseOut/FormPanelController.js

@@ -38,6 +38,8 @@ Ext.define('saas.view.purchase.purchaseOut.FormPanelController', {
                             from:'pr_detail',to:'pr_detail'
                         },{
                             from:'pr_unit',to:'pd_unit'
+                        },{
+                            from:'pr_spec',to:'pr_spec'
                         },{
                             from:'pr_whid',to:'pd_whid'
                         },{

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

@@ -295,23 +295,23 @@ Ext.define('saas.view.sale.sale.FormPanel', {
     }, {
         xtype : "textfield", 
         name : "sa_total", 
-        fieldLabel : "单据金额",
+        fieldLabel : "销售金额",
         readOnly:true
     },{
-        xtype : "employeeDbfindTrigger", 
+        xtype : "hidden", 
         name : "sa_sellercode", 
         fieldLabel : "业务员编号",
     },{
-        xtype : "textfield", 
+        xtype : "employeeDbfindTrigger", 
         name : "sa_seller", 
         fieldLabel : "业务员",
-        readOnly:true
+        defaultValue:saas.util.BaseUtil.getCurrentUser().realname
     }, {
         xtype : 'textfield', 
         name : 'sa_sendstatus', 
         fieldLabel : '出货状态', 
         hidden : true,
-        readOnly:true
+        defaultValue:saas.util.BaseUtil.getCurrentUser().id
      },{
         xtype : "hidden", 
         name : "creatorId", 

+ 8 - 6
frontend/saas-web/app/view/stock/appropriationInOut/QueryPanel.js

@@ -184,11 +184,7 @@ Ext.define('saas.view.stock.appropriationInOut.QueryPanel', {
                 dataIndex: 'pr_detail',
                 width: 200
             },{
-                text: '型号',
-                dataIndex: 'pr_orispeccode',
-                width: 150
-            },{
-                text: '规格',
+                text: '型号规格',
                 dataIndex: 'pr_spec',
                 width: 150
             },{
@@ -199,7 +195,13 @@ Ext.define('saas.view.stock.appropriationInOut.QueryPanel', {
                 text: '数量',
                 dataIndex: 'pd_outqty',
                 xtype:'numbercolumn',
-                width: 110
+                width: 110,
+                renderer : function(v) {
+                    var arr = (v + '.').split('.');
+                    var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                    var format = '0,000.' + xr.join();
+                    return Ext.util.Format.number(v, format);
+                }
             },{
                 text: '拨出仓',
                 dataIndex: 'pd_whname',

+ 6 - 0
frontend/saas-web/app/view/stock/make/QueryPanel.js

@@ -136,6 +136,12 @@ Ext.define('saas.view.stock.make.QueryPanel', {
             dataIndex: 'ma_qty',
             xtype: 'numbercolumn',
             width: 110,
+            renderer : function(v) {
+                var arr = (v + '.').split('.');
+                var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                var format = '0,000.' + xr.join();
+                return Ext.util.Format.number(v, format);
+            },
         },{
             text: '单位',
             dataIndex: 'ma_produnit',

+ 7 - 1
frontend/saas-web/app/view/stock/otherIn/QueryPanel.js

@@ -188,7 +188,13 @@ Ext.define('saas.view.stock.otherIn.QueryPanel', {
             text: '数量',
             dataIndex: 'pd_inqty',
             xtype:'numbercolumn',
-            width: 10
+            width: 10,
+            renderer : function(v) {
+                var arr = (v + '.').split('.');
+                var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                var format = '0,000.' + xr.join();
+                return Ext.util.Format.number(v, format);
+            },
         },{
             text: '仓库',
             dataIndex: 'pd_whname',

+ 7 - 1
frontend/saas-web/app/view/stock/otherOut/QueryPanel.js

@@ -188,7 +188,13 @@ Ext.define('saas.view.stock.otherOut.QueryPanel', {
             text: '数量',
             dataIndex: 'pd_inqty',
             xtype:'numbercolumn',
-            width: 10
+            width: 10,
+            renderer : function(v) {
+                var arr = (v + '.').split('.');
+                var xr = (new Array(arr[1].length > 3 ? 3 : arr[1].length)).fill('0');
+                var format = '0,000.' + xr.join();
+                return Ext.util.Format.number(v, format);
+            }
         },{
             text: '仓库',
             dataIndex: 'pd_whname',

+ 112 - 68
frontend/saas-web/app/view/stock/report/DataList.js

@@ -9,99 +9,143 @@ Ext.define('saas.view.stock.report.DataList', {
 
     groupField: null,
     listUrl: '/api/document/product/ReserveCost',
+    // listUrl: 'http://192.168.253.41:8560/api/document/product/ReserveCost',
     defaultCondition: null,
     reportTitle: '物料库存数量金额表',
-    QueryWidth:0.2,
+    QueryWidth: 0.4,
+    printAble: false,
+    exportAble: true,
 
     searchItems: [{
         name: 'pr_code',
         xtype: 'textfield',
-        emptyText : '物料编号',
-        columnWidth: 0.2
-    },{
-        name: 'pr_detail',
-        xtype: 'textfield',
-        emptyText : '物料名称',
-        columnWidth: 0.2
-    },{
+        emptyText: '物料编号/名称/规格',
+        columnWidth: 0.25,
+        getCondition: function (v) {
+            return "(upper(pr_spec) like '%" + v.toUpperCase() + "%' or upper(pr_code) like '%" + v.toUpperCase() + "%' or upper(pr_detail) like '%" + v.toUpperCase() + "%')";
+        },
+    }, {
         name: 'wh_code',
         xtype: 'textfield',
-        emptyText : '仓库编号',
-        columnWidth: 0.2
-    },{
-        name: 'wh_description',
-        xtype: 'textfield',
-        emptyText : '仓库名称',
-        columnWidth: 0.2
+        emptyText: '仓库编号/名称',
+        columnWidth: 0.25,
+        getCondition: function (v) {
+            return "(upper(wh_code) like '%" + v.toUpperCase() + "%' or upper(wh_description) like '%" + v.toUpperCase() + "%')";
+        }
+    }, {
+        name: 'toggle',
+        xtype: 'checkbox',
+        fieldLabel: '分仓库存',
+        columnWidth: 0.1,
+        labelAlign: 'left',
+        labelWidth: 70,
+        ignore: true,
+        listeners: {
+            change: 'toggle_change'
+        }
     }],
 
-    reportColumns : [{
-        text : "物料编号", 
-        width : 150, 
-        dataIndex : "rc_prodCode", 
-        xtype : "", 
-    },{
-        text : "物料名称", 
-        width : 200.0, 
-        dataIndex : "rc_prodDetail", 
-    }, 
-    {
-        text : "物料规格", 
-        dataIndex : "rc_prodSpec", 
-        width : 150.0, 
-    }, 
-    {
-        text : "单位", 
-        dataIndex : "rc_prodUnit", 
-        width : 80.0, 
-    }, 
-    {
-        text : "仓库编号", 
-        dataIndex : "rc_whCode", 
-        width : 150, 
-    }, 
-    {
-        text : "仓库名称", 
-        dataIndex : "rc_whName", 
-        width : 200.0, 
-    }, 
-    {
-        text : "数量",
+    reportColumns2: [{
+        text: "物料编号",
+        width: 200,
+        dataIndex: "rc_prodCode",
+        xtype: "",
+    }, {
+        text: "物料名称",
+        width: 200,
+        dataIndex: "rc_prodDetail",
+    }, {
+        text: "物料规格",
+        dataIndex: "rc_prodSpec",
+        width: 200,
+    }, {
+        text: "单位",
+        dataIndex: "rc_prodUnit",
+        width: 150,
+    }, {
+        text: "仓库编号",
+        dataIndex: "rc_whCode",
+        width: 200,
+    }, {
+        text: "仓库名称",
+        dataIndex: "rc_whName",
+        width: 200,
+    }, {
+        text: "数量",
         xtype: 'numbercolumn',
-        dataIndex : "rc_number", 
-        width : 110.0, 
-        renderer : function(v) {
+        dataIndex: "rc_number",
+        width: 150,
+        renderer: function (v) {
             var arr = (v + '.').split('.');
-            var xr = (new Array(arr[1].length>3?3:arr[1].length)).fill('0');
+            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 : "单价",
+    }, {
+        text: "单价",
         xtype: 'numbercolumn',
         align: 'end',
-        dataIndex : "rc_price", 
-        width : 110.0, 
-        renderer : function(v) {
+        dataIndex: "rc_price",
+        width: 150,
+        renderer: function (v) {
             var arr = (v + '.').split('.');
-            var xr = (new Array(arr[1].length>8?8:arr[1].length)).fill('0');
+            var xr = (new Array(arr[1].length > 8 ? 8 : arr[1].length)).fill('0');
             var format = '0.' + xr.join();
             return Ext.util.Format.number(v, format);
         }
-    }, 
-    {
-        text : "金额", 
+    }, {
+        text: "金额",
         xtype: 'numbercolumn',
-        dataIndex : "rc_amount", 
-        width : 110.0,
-        renderer : function(v) {
+        dataIndex: "rc_amount",
+        width: 150,
+        renderer: function (v) {
             var arr = (v + '.').split('.');
-            var xr = (new Array(arr[1].length>2?2:arr[1].length)).fill('0');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
             var format = '0.' + xr.join();
             return Ext.util.Format.number(v, format);
         },
     }],
-})
-
 
+    reportColumns: [{
+        text: "物料编号",
+        width: 200,
+        dataIndex: "rc_prodCode",
+        xtype: "",
+    }, {
+        text: "物料名称",
+        width: 200,
+        dataIndex: "rc_prodDetail",
+    }, {
+        text: "物料规格",
+        dataIndex: "rc_prodSpec",
+        width: 200,
+    }, {
+        text: "单位",
+        dataIndex: "rc_prodUnit",
+        width: 150,
+    }, {
+        text: "数量",
+        xtype: 'numbercolumn',
+        dataIndex: "rc_number",
+        width: 150,
+        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: "金额",
+        xtype: 'numbercolumn',
+        dataIndex: "rc_amount",
+        width: 150,
+        renderer: function (v) {
+            var arr = (v + '.').split('.');
+            var xr = (new Array(arr[1].length > 2 ? 2 : arr[1].length)).fill('0');
+            var format = '0.' + xr.join();
+            return Ext.util.Format.number(v, format);
+        },
+    }, {
+        flex: 1
+    }],
+})

+ 22 - 4
frontend/saas-web/app/view/stock/report/DataListController.js

@@ -2,9 +2,27 @@ Ext.define('saas.view.stock.report.DataListController', {
     extend: 'saas.view.core.report.ReportPanelController',
     alias: 'controller.stock-report-datalist',
 
-    init: function (form) {
-        var me = this;
-        this.control({
-        });
+    toggle_change: function(field, newValue, oldValue, eOpts) {
+        var me = this,
+        reportPanel = me.getView(),
+        form = reportPanel.down('form'),
+        grid = reportPanel.down('grid'),
+        store = grid.store;
+        
+        // var whCodeField = form.getForm().findField('wh_code');
+        // whCodeField.setValue('');
+        // whCodeField.setHidden(!newValue);
+
+        if(newValue) {
+            reportPanel.queryMode = 'DETAIL';
+            store.load(function() {
+                grid.reconfigure(store, reportPanel.reportColumns2);
+            });
+        }else {
+            reportPanel.queryMode = 'MAIN';
+            store.load(function() {
+                grid.reconfigure(store, reportPanel.reportColumns);
+            });
+        }
     }
 });

+ 2 - 2
frontend/saas-web/app/view/sys/account/DataList.js

@@ -89,13 +89,13 @@ Ext.define('saas.view.sys.account.DataList', {
         width : 180.0, 
         xtype : '', 
     },{
-        text : '关联角色id', 
+        text : '岗位角色id', 
         hidden:true,
         dataIndex : 'roleIds', 
         width : 110.0, 
         xtype : '', 
     },{
-        text : '关联角色', 
+        text : '岗位角色', 
         dataIndex : 'roleNames', 
         width : 220.0
     },{

+ 14 - 0
frontend/saas-web/electron/.gitignore

@@ -0,0 +1,14 @@
+dist/
+out/
+.idea
+node_modules/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+package-lock.json
+
+### VSCODE ###
+.vscode
+
+### sencha log ###
+*.log

+ 32 - 0
frontend/saas-web/electron/main.dev.js

@@ -0,0 +1,32 @@
+const { app, BrowserWindow } = require('electron');
+let mainWindow;
+
+function createWindow () {
+    mainWindow = new BrowserWindow({ width: 1280, height: 720, show: false });
+    mainWindow.once('ready-to-show', function(){
+        mainWindow.maximize();
+        mainWindow.show();
+    });
+    mainWindow.loadURL('http://127.0.0.1:1841/');
+
+    mainWindow.webContents.openDevTools();
+
+    mainWindow.on('closed', function () {
+        mainWindow = null;
+    });
+}
+
+app.on('ready', createWindow);
+
+// Quit when all windows are closed, except for Mac users
+app.on('window-all-closed', function () {
+    if (process.platform !== 'darwin') {
+        app.quit()
+    }
+});
+
+app.on('activate', function () {
+    if (mainWindow === null) {
+        createWindow();
+    }
+});

+ 42 - 0
frontend/saas-web/electron/main.js

@@ -0,0 +1,42 @@
+const { app, BrowserWindow } = require('electron');
+const path = require('path');
+const url = require('url');
+const isLocal = process.argv[process.argv.length - 1] === 'local';
+const extDir = isLocal ? '../build/production/saas' : 'dist';
+let mainWindow;
+
+function createWindow () {
+    mainWindow = new BrowserWindow({ width: 1280, height: 720, show: false });
+    mainWindow.once('ready-to-show', function(){
+        mainWindow.maximize();
+        mainWindow.show();
+    });
+    mainWindow.loadURL(url.format({
+        pathname: path.join(__dirname, extDir + '/index.html'),
+        protocol: 'file:',
+        slashes: true
+    }));
+
+    if (isLocal) {
+        mainWindow.webContents.openDevTools();
+    }
+
+    mainWindow.on('closed', function () {
+        mainWindow = null;
+    });
+}
+
+app.on('ready', createWindow);
+
+// Quit when all windows are closed, except for Mac users
+app.on('window-all-closed', function () {
+    if (process.platform !== 'darwin') {
+        app.quit()
+    }
+});
+
+app.on('activate', function () {
+    if (mainWindow === null) {
+        createWindow();
+    }
+});

+ 21 - 0
frontend/saas-web/electron/package.json

@@ -0,0 +1,21 @@
+{
+  "name": "saas-client",
+  "version": "1.0.0",
+  "description": "saas在线进销存系统",
+  "main": "./main.js",
+  "scripts": {
+    "dev-start": "electron ./main.dev.js",
+    "prod-start": "electron . local",
+    "build": "cd ../ && sencha app build --build prod --destination electron/dist/ --production",
+    "pack-win": "electron-packager . saas --overwrite --asar --platform=win32 --arch=x64 --out=out --ignore=\"(src|docs|out|.gitignore|LICENSE.md|README.md|npm-debug.log|node_modules|.idea|main.dev.js|package-lock.json|yarn.lock)\"",
+    "pack": "npm run build && npm run pack-win"
+  },
+  "author": "yingp@usoftchina.com",
+  "license": "ISC",
+  "dependencies": {
+    "electron": "^1.8.1"
+  },
+  "devDependencies": {
+    "electron-packager": "^9.0.1"
+  }
+}

+ 1289 - 0
frontend/saas-web/electron/yarn.lock

@@ -0,0 +1,1289 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@types/node@^8.0.24":
+  version "8.10.38"
+  resolved "http://registry.npm.taobao.org/@types/node/download/@types/node-8.10.38.tgz#e05c201a668492e534b48102aca0294898f449f6"
+
+abbrev@1:
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+ajv@^6.5.5:
+  version "6.6.1"
+  resolved "http://registry.npm.taobao.org/ajv/download/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61"
+  dependencies:
+    fast-deep-equal "^2.0.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "http://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+array-find-index@^1.0.1:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/array-find-index/download/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+asar@^0.13.0:
+  version "0.13.1"
+  resolved "http://registry.npm.taobao.org/asar/download/asar-0.13.1.tgz#dfc73f574a7db256b09ba62d1f0e95cd4a6cb8d3"
+  dependencies:
+    chromium-pickle-js "^0.2.0"
+    commander "^2.9.0"
+    cuint "^0.2.1"
+    glob "^6.0.4"
+    minimatch "^3.0.3"
+    mkdirp "^0.5.0"
+    mksnapshot "^0.3.0"
+    tmp "0.0.28"
+
+asn1@~0.2.3:
+  version "0.2.4"
+  resolved "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+  dependencies:
+    safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+author-regex@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/author-regex/download/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450"
+
+aws-sign2@~0.7.0:
+  version "0.7.0"
+  resolved "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+
+aws4@^1.8.0:
+  version "1.8.0"
+  resolved "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
+
+balanced-match@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/base64-js/download/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1"
+
+base64-js@^1.2.3:
+  version "1.3.0"
+  resolved "http://registry.npm.taobao.org/base64-js/download/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+bcrypt-pbkdf@^1.0.0:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+  dependencies:
+    tweetnacl "^0.14.3"
+
+binary@^0.3.0:
+  version "0.3.0"
+  resolved "http://registry.npm.taobao.org/binary/download/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79"
+  dependencies:
+    buffers "~0.1.1"
+    chainsaw "~0.1.0"
+
+bluebird@^3.1.1, bluebird@^3.5.0:
+  version "3.5.3"
+  resolved "http://registry.npm.taobao.org/bluebird/download/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
+
+brace-expansion@^1.1.7:
+  version "1.1.11"
+  resolved "http://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  dependencies:
+    balanced-match "^1.0.0"
+    concat-map "0.0.1"
+
+buffer-alloc-unsafe@^1.1.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/buffer-alloc-unsafe/download/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
+
+buffer-alloc@^1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/buffer-alloc/download/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec"
+  dependencies:
+    buffer-alloc-unsafe "^1.1.0"
+    buffer-fill "^1.0.0"
+
+buffer-fill@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/buffer-fill/download/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c"
+
+buffer-from@^1.0.0:
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/buffer-from/download/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+
+buffers@~0.1.1:
+  version "0.1.1"
+  resolved "http://registry.npm.taobao.org/buffers/download/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb"
+
+builtin-modules@^1.0.0:
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/builtin-modules/download/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+camelcase-keys@^2.0.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/camelcase-keys/download/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+  dependencies:
+    camelcase "^2.0.0"
+    map-obj "^1.0.0"
+
+camelcase@^2.0.0:
+  version "2.1.1"
+  resolved "http://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
+camelize@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/camelize/download/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b"
+
+caseless@~0.12.0:
+  version "0.12.0"
+  resolved "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+chainsaw@~0.1.0:
+  version "0.1.0"
+  resolved "http://registry.npm.taobao.org/chainsaw/download/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98"
+  dependencies:
+    traverse ">=0.3.0 <0.4"
+
+chromium-pickle-js@^0.2.0:
+  version "0.2.0"
+  resolved "http://registry.npm.taobao.org/chromium-pickle-js/download/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205"
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+combined-stream@^1.0.6, combined-stream@~1.0.6:
+  version "1.0.7"
+  resolved "http://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828"
+  dependencies:
+    delayed-stream "~1.0.0"
+
+commander@^2.9.0:
+  version "2.19.0"
+  resolved "http://registry.npm.taobao.org/commander/download/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
+
+compare-version@^0.1.2:
+  version "0.1.2"
+  resolved "http://registry.npm.taobao.org/compare-version/download/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080"
+
+concat-map@0.0.1:
+  version "0.0.1"
+  resolved "http://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@1.6.2:
+  version "1.6.2"
+  resolved "http://registry.npm.taobao.org/concat-stream/download/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+  dependencies:
+    buffer-from "^1.0.0"
+    inherits "^2.0.3"
+    readable-stream "^2.2.2"
+    typedarray "^0.0.6"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+cuint@^0.2.1:
+  version "0.2.2"
+  resolved "http://registry.npm.taobao.org/cuint/download/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b"
+
+currently-unhandled@^0.4.1:
+  version "0.4.1"
+  resolved "http://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+  dependencies:
+    array-find-index "^1.0.1"
+
+dashdash@^1.12.0:
+  version "1.14.1"
+  resolved "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  dependencies:
+    assert-plus "^1.0.0"
+
+debug@2.6.9, debug@^2.1.3, debug@^2.2.0, debug@^2.6.8:
+  version "2.6.9"
+  resolved "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  dependencies:
+    ms "2.0.0"
+
+debug@^3.0.0:
+  version "3.2.6"
+  resolved "http://registry.npm.taobao.org/debug/download/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+  dependencies:
+    ms "^2.1.1"
+
+decamelize@^1.1.2:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decompress-zip@0.3.0:
+  version "0.3.0"
+  resolved "http://registry.npm.taobao.org/decompress-zip/download/decompress-zip-0.3.0.tgz#ae3bcb7e34c65879adfe77e19c30f86602b4bdb0"
+  dependencies:
+    binary "^0.3.0"
+    graceful-fs "^4.1.3"
+    mkpath "^0.1.0"
+    nopt "^3.0.1"
+    q "^1.1.2"
+    readable-stream "^1.1.8"
+    touch "0.0.3"
+
+deep-extend@^0.6.0:
+  version "0.6.0"
+  resolved "http://registry.npm.taobao.org/deep-extend/download/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+ecc-jsbn@~0.1.1:
+  version "0.1.2"
+  resolved "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+  dependencies:
+    jsbn "~0.1.0"
+    safer-buffer "^2.1.0"
+
+electron-download@^3.0.1:
+  version "3.3.0"
+  resolved "http://registry.npm.taobao.org/electron-download/download/electron-download-3.3.0.tgz#2cfd54d6966c019c4d49ad65fbe65cc9cdef68c8"
+  dependencies:
+    debug "^2.2.0"
+    fs-extra "^0.30.0"
+    home-path "^1.0.1"
+    minimist "^1.2.0"
+    nugget "^2.0.0"
+    path-exists "^2.1.0"
+    rc "^1.1.2"
+    semver "^5.3.0"
+    sumchecker "^1.2.0"
+
+electron-download@^4.0.0:
+  version "4.1.1"
+  resolved "http://registry.npm.taobao.org/electron-download/download/electron-download-4.1.1.tgz#02e69556705cc456e520f9e035556ed5a015ebe8"
+  dependencies:
+    debug "^3.0.0"
+    env-paths "^1.0.0"
+    fs-extra "^4.0.1"
+    minimist "^1.2.0"
+    nugget "^2.0.1"
+    path-exists "^3.0.0"
+    rc "^1.2.1"
+    semver "^5.4.1"
+    sumchecker "^2.0.2"
+
+electron-osx-sign@^0.4.1:
+  version "0.4.11"
+  resolved "http://registry.npm.taobao.org/electron-osx-sign/download/electron-osx-sign-0.4.11.tgz#8377732fe7b207969f264b67582ee47029ce092f"
+  dependencies:
+    bluebird "^3.5.0"
+    compare-version "^0.1.2"
+    debug "^2.6.8"
+    isbinaryfile "^3.0.2"
+    minimist "^1.2.0"
+    plist "^3.0.1"
+
+electron-packager@^9.0.1:
+  version "9.1.0"
+  resolved "http://registry.npm.taobao.org/electron-packager/download/electron-packager-9.1.0.tgz#4b2ef9f8343f5de431182d82929d9c06c0d51a1d"
+  dependencies:
+    asar "^0.13.0"
+    camelize "^1.0.0"
+    debug "^3.0.0"
+    electron-download "^4.0.0"
+    electron-osx-sign "^0.4.1"
+    extract-zip "^1.0.3"
+    fs-extra "^4.0.0"
+    get-package-info "^1.0.0"
+    minimist "^1.1.1"
+    parse-author "^2.0.0"
+    pify "^3.0.0"
+    plist "^2.0.0"
+    pruner "^0.0.7"
+    rcedit "^0.9.0"
+    resolve "^1.1.6"
+    run-series "^1.1.1"
+    sanitize-filename "^1.6.0"
+    semver "^5.3.0"
+
+electron@^1.8.1:
+  version "1.8.8"
+  resolved "http://registry.npm.taobao.org/electron/download/electron-1.8.8.tgz#a90cddb075291f49576993e6f5c8bb4439301cae"
+  dependencies:
+    "@types/node" "^8.0.24"
+    electron-download "^3.0.1"
+    extract-zip "^1.0.3"
+
+env-paths@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/env-paths/download/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0"
+
+error-ex@^1.2.0:
+  version "1.3.2"
+  resolved "http://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+  dependencies:
+    is-arrayish "^0.2.1"
+
+es6-promise@^4.0.5:
+  version "4.2.5"
+  resolved "http://registry.npm.taobao.org/es6-promise/download/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
+
+extend@~3.0.2:
+  version "3.0.2"
+  resolved "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+
+extract-zip@^1.0.3:
+  version "1.6.7"
+  resolved "http://registry.npm.taobao.org/extract-zip/download/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9"
+  dependencies:
+    concat-stream "1.6.2"
+    debug "2.6.9"
+    mkdirp "0.5.1"
+    yauzl "2.4.1"
+
+extsprintf@1.3.0:
+  version "1.3.0"
+  resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+
+extsprintf@^1.2.0:
+  version "1.4.0"
+  resolved "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+
+fast-deep-equal@^2.0.1:
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
+fast-json-stable-stringify@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fd-slicer@~1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/fd-slicer/download/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65"
+  dependencies:
+    pend "~1.2.0"
+
+find-up@^1.0.0:
+  version "1.1.2"
+  resolved "http://registry.npm.taobao.org/find-up/download/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  dependencies:
+    path-exists "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+find-up@^2.0.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/find-up/download/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+  dependencies:
+    locate-path "^2.0.0"
+
+forever-agent@~0.6.1:
+  version "0.6.1"
+  resolved "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.3.2:
+  version "2.3.3"
+  resolved "http://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.6"
+    mime-types "^2.1.12"
+
+fs-extra@0.26.7:
+  version "0.26.7"
+  resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^2.1.0"
+    klaw "^1.0.0"
+    path-is-absolute "^1.0.0"
+    rimraf "^2.2.8"
+
+fs-extra@^0.30.0:
+  version "0.30.0"
+  resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^2.1.0"
+    klaw "^1.0.0"
+    path-is-absolute "^1.0.0"
+    rimraf "^2.2.8"
+
+fs-extra@^4.0.0, fs-extra@^4.0.1:
+  version "4.0.3"
+  resolved "http://registry.npm.taobao.org/fs-extra/download/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
+  dependencies:
+    graceful-fs "^4.1.2"
+    jsonfile "^4.0.0"
+    universalify "^0.1.0"
+
+fs.realpath@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/fs.realpath/download/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+get-package-info@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/get-package-info/download/get-package-info-1.0.0.tgz#6432796563e28113cd9474dbbd00052985a4999c"
+  dependencies:
+    bluebird "^3.1.1"
+    debug "^2.2.0"
+    lodash.get "^4.0.0"
+    read-pkg-up "^2.0.0"
+
+get-stdin@^4.0.1:
+  version "4.0.1"
+  resolved "http://registry.npm.taobao.org/get-stdin/download/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+getpass@^0.1.1:
+  version "0.1.7"
+  resolved "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  dependencies:
+    assert-plus "^1.0.0"
+
+glob@^6.0.4:
+  version "6.0.4"
+  resolved "http://registry.npm.taobao.org/glob/download/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
+  dependencies:
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "2 || 3"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+glob@^7.0.5:
+  version "7.1.3"
+  resolved "http://registry.npm.taobao.org/glob/download/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+  dependencies:
+    fs.realpath "^1.0.0"
+    inflight "^1.0.4"
+    inherits "2"
+    minimatch "^3.0.4"
+    once "^1.3.0"
+    path-is-absolute "^1.0.0"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+  version "4.1.15"
+  resolved "http://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
+
+har-schema@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+
+har-validator@~5.1.0:
+  version "5.1.3"
+  resolved "http://registry.npm.taobao.org/har-validator/download/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
+  dependencies:
+    ajv "^6.5.5"
+    har-schema "^2.0.0"
+
+home-path@^1.0.1:
+  version "1.0.6"
+  resolved "http://registry.npm.taobao.org/home-path/download/home-path-1.0.6.tgz#d549dc2465388a7f8667242c5b31588d29af29fc"
+
+hosted-git-info@^2.1.4:
+  version "2.7.1"
+  resolved "http://registry.npm.taobao.org/hosted-git-info/download/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+
+http-signature@~1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+  dependencies:
+    assert-plus "^1.0.0"
+    jsprim "^1.2.2"
+    sshpk "^1.7.0"
+
+indent-string@^2.1.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/indent-string/download/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+  dependencies:
+    repeating "^2.0.0"
+
+inflight@^1.0.4:
+  version "1.0.6"
+  resolved "http://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  dependencies:
+    once "^1.3.0"
+    wrappy "1"
+
+inherits@2, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+  version "2.0.3"
+  resolved "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+ini@~1.3.0:
+  version "1.3.5"
+  resolved "http://registry.npm.taobao.org/ini/download/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+is-arrayish@^0.2.1:
+  version "0.2.1"
+  resolved "http://registry.npm.taobao.org/is-arrayish/download/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-builtin-module@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/is-builtin-module/download/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+  dependencies:
+    builtin-modules "^1.0.0"
+
+is-finite@^1.0.0:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/is-finite/download/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  dependencies:
+    number-is-nan "^1.0.0"
+
+is-typedarray@~1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+  version "0.2.1"
+  resolved "http://registry.npm.taobao.org/is-utf8/download/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+isarray@0.0.1:
+  version "0.0.1"
+  resolved "http://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@~1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isbinaryfile@^3.0.2:
+  version "3.0.3"
+  resolved "http://registry.npm.taobao.org/isbinaryfile/download/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80"
+  dependencies:
+    buffer-alloc "^1.2.0"
+
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+jsbn@~0.1.0:
+  version "0.1.1"
+  resolved "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+json-schema-traverse@^0.4.1:
+  version "0.4.1"
+  resolved "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
+json-schema@0.2.3:
+  version "0.2.3"
+  resolved "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stringify-safe@~5.0.1:
+  version "5.0.1"
+  resolved "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+jsonfile@^2.1.0:
+  version "2.4.0"
+  resolved "http://registry.npm.taobao.org/jsonfile/download/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsonfile@^4.0.0:
+  version "4.0.0"
+  resolved "http://registry.npm.taobao.org/jsonfile/download/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+  optionalDependencies:
+    graceful-fs "^4.1.6"
+
+jsprim@^1.2.2:
+  version "1.4.1"
+  resolved "http://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+  dependencies:
+    assert-plus "1.0.0"
+    extsprintf "1.3.0"
+    json-schema "0.2.3"
+    verror "1.10.0"
+
+klaw@^1.0.0:
+  version "1.3.1"
+  resolved "http://registry.npm.taobao.org/klaw/download/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+  optionalDependencies:
+    graceful-fs "^4.1.9"
+
+load-json-file@^1.0.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/load-json-file/download/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    strip-bom "^2.0.0"
+
+load-json-file@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/load-json-file/download/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+  dependencies:
+    graceful-fs "^4.1.2"
+    parse-json "^2.2.0"
+    pify "^2.0.0"
+    strip-bom "^3.0.0"
+
+locate-path@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/locate-path/download/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+  dependencies:
+    p-locate "^2.0.0"
+    path-exists "^3.0.0"
+
+lodash.get@^4.0.0:
+  version "4.4.2"
+  resolved "http://registry.npm.taobao.org/lodash.get/download/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
+
+loud-rejection@^1.0.0:
+  version "1.6.0"
+  resolved "http://registry.npm.taobao.org/loud-rejection/download/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+  dependencies:
+    currently-unhandled "^0.4.1"
+    signal-exit "^3.0.0"
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/map-obj/download/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+
+meow@^3.1.0:
+  version "3.7.0"
+  resolved "http://registry.npm.taobao.org/meow/download/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+  dependencies:
+    camelcase-keys "^2.0.0"
+    decamelize "^1.1.2"
+    loud-rejection "^1.0.0"
+    map-obj "^1.0.1"
+    minimist "^1.1.3"
+    normalize-package-data "^2.3.4"
+    object-assign "^4.0.1"
+    read-pkg-up "^1.0.1"
+    redent "^1.0.0"
+    trim-newlines "^1.0.0"
+
+mime-db@~1.37.0:
+  version "1.37.0"
+  resolved "http://registry.npm.taobao.org/mime-db/download/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8"
+
+mime-types@^2.1.12, mime-types@~2.1.19:
+  version "2.1.21"
+  resolved "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96"
+  dependencies:
+    mime-db "~1.37.0"
+
+"minimatch@2 || 3", minimatch@^3.0.3, minimatch@^3.0.4:
+  version "3.0.4"
+  resolved "http://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  dependencies:
+    brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+  version "0.0.8"
+  resolved "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+mkdirp@0.5.1, mkdirp@^0.5.0:
+  version "0.5.1"
+  resolved "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+  dependencies:
+    minimist "0.0.8"
+
+mkpath@^0.1.0:
+  version "0.1.0"
+  resolved "http://registry.npm.taobao.org/mkpath/download/mkpath-0.1.0.tgz#7554a6f8d871834cc97b5462b122c4c124d6de91"
+
+mksnapshot@^0.3.0:
+  version "0.3.1"
+  resolved "http://registry.npm.taobao.org/mksnapshot/download/mksnapshot-0.3.1.tgz#2501c05657436d742ce958a4ff92c77e40dd37e6"
+  dependencies:
+    decompress-zip "0.3.0"
+    fs-extra "0.26.7"
+    request "^2.79.0"
+
+ms@2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+ms@^2.1.1:
+  version "2.1.1"
+  resolved "http://registry.npm.taobao.org/ms/download/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+
+nopt@^3.0.1:
+  version "3.0.6"
+  resolved "http://registry.npm.taobao.org/nopt/download/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+  dependencies:
+    abbrev "1"
+
+nopt@~1.0.10:
+  version "1.0.10"
+  resolved "http://registry.npm.taobao.org/nopt/download/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
+  dependencies:
+    abbrev "1"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+  version "2.4.0"
+  resolved "http://registry.npm.taobao.org/normalize-package-data/download/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+  dependencies:
+    hosted-git-info "^2.1.4"
+    is-builtin-module "^1.0.0"
+    semver "2 || 3 || 4 || 5"
+    validate-npm-package-license "^3.0.1"
+
+nugget@^2.0.0, nugget@^2.0.1:
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/nugget/download/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0"
+  dependencies:
+    debug "^2.1.3"
+    minimist "^1.1.0"
+    pretty-bytes "^1.0.2"
+    progress-stream "^1.1.0"
+    request "^2.45.0"
+    single-line-log "^1.1.2"
+    throttleit "0.0.2"
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+oauth-sign@~0.9.0:
+  version "0.9.0"
+  resolved "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+
+object-assign@^4.0.1:
+  version "4.1.1"
+  resolved "http://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-keys@~0.4.0:
+  version "0.4.0"
+  resolved "http://registry.npm.taobao.org/object-keys/download/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336"
+
+once@^1.3.0:
+  version "1.4.0"
+  resolved "http://registry.npm.taobao.org/once/download/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  dependencies:
+    wrappy "1"
+
+os-tmpdir@~1.0.1:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+p-limit@^1.1.0:
+  version "1.3.0"
+  resolved "http://registry.npm.taobao.org/p-limit/download/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+  dependencies:
+    p-try "^1.0.0"
+
+p-locate@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/p-locate/download/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+  dependencies:
+    p-limit "^1.1.0"
+
+p-try@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/p-try/download/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+parse-author@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/parse-author/download/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f"
+  dependencies:
+    author-regex "^1.0.0"
+
+parse-json@^2.2.0:
+  version "2.2.0"
+  resolved "http://registry.npm.taobao.org/parse-json/download/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+  dependencies:
+    error-ex "^1.2.0"
+
+path-exists@^2.0.0, path-exists@^2.1.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/path-exists/download/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  dependencies:
+    pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+  version "3.0.0"
+  resolved "http://registry.npm.taobao.org/path-exists/download/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-parse@^1.0.5:
+  version "1.0.6"
+  resolved "http://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+
+path-type@^1.0.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/path-type/download/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+  dependencies:
+    graceful-fs "^4.1.2"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
+path-type@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/path-type/download/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+  dependencies:
+    pify "^2.0.0"
+
+pend@~1.2.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/pend/download/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+
+performance-now@^2.1.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+
+pify@^2.0.0:
+  version "2.3.0"
+  resolved "http://registry.npm.taobao.org/pify/download/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+  version "3.0.0"
+  resolved "http://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pinkie-promise@^2.0.0:
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/pinkie-promise/download/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  dependencies:
+    pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+  version "2.0.4"
+  resolved "http://registry.npm.taobao.org/pinkie/download/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+plist@^2.0.0:
+  version "2.1.0"
+  resolved "http://registry.npm.taobao.org/plist/download/plist-2.1.0.tgz#57ccdb7a0821df21831217a3cad54e3e146a1025"
+  dependencies:
+    base64-js "1.2.0"
+    xmlbuilder "8.2.2"
+    xmldom "0.1.x"
+
+plist@^3.0.1:
+  version "3.0.1"
+  resolved "http://registry.npm.taobao.org/plist/download/plist-3.0.1.tgz#a9b931d17c304e8912ef0ba3bdd6182baf2e1f8c"
+  dependencies:
+    base64-js "^1.2.3"
+    xmlbuilder "^9.0.7"
+    xmldom "0.1.x"
+
+pretty-bytes@^1.0.2:
+  version "1.0.4"
+  resolved "http://registry.npm.taobao.org/pretty-bytes/download/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84"
+  dependencies:
+    get-stdin "^4.0.1"
+    meow "^3.1.0"
+
+process-nextick-args@~2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+progress-stream@^1.1.0:
+  version "1.2.0"
+  resolved "http://registry.npm.taobao.org/progress-stream/download/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77"
+  dependencies:
+    speedometer "~0.1.2"
+    through2 "~0.2.3"
+
+pruner@^0.0.7:
+  version "0.0.7"
+  resolved "http://registry.npm.taobao.org/pruner/download/pruner-0.0.7.tgz#345fbcb3e80701163a1d7adf56bac229a5a1e4c1"
+  dependencies:
+    fs-extra "^4.0.0"
+
+psl@^1.1.24:
+  version "1.1.29"
+  resolved "http://registry.npm.taobao.org/psl/download/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67"
+
+punycode@^1.4.1:
+  version "1.4.1"
+  resolved "http://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+  version "2.1.1"
+  resolved "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+q@^1.1.2:
+  version "1.5.1"
+  resolved "http://registry.npm.taobao.org/q/download/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+
+qs@~6.5.2:
+  version "6.5.2"
+  resolved "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+
+rc@^1.1.2, rc@^1.2.1:
+  version "1.2.8"
+  resolved "http://registry.npm.taobao.org/rc/download/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+  dependencies:
+    deep-extend "^0.6.0"
+    ini "~1.3.0"
+    minimist "^1.2.0"
+    strip-json-comments "~2.0.1"
+
+rcedit@^0.9.0:
+  version "0.9.0"
+  resolved "http://registry.npm.taobao.org/rcedit/download/rcedit-0.9.0.tgz#3910df57345399e2b0325f4a519007f89e55ef1c"
+
+read-pkg-up@^1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+  dependencies:
+    find-up "^1.0.0"
+    read-pkg "^1.0.0"
+
+read-pkg-up@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/read-pkg-up/download/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+  dependencies:
+    find-up "^2.0.0"
+    read-pkg "^2.0.0"
+
+read-pkg@^1.0.0:
+  version "1.1.0"
+  resolved "http://registry.npm.taobao.org/read-pkg/download/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+  dependencies:
+    load-json-file "^1.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^1.0.0"
+
+read-pkg@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/read-pkg/download/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+  dependencies:
+    load-json-file "^2.0.0"
+    normalize-package-data "^2.3.2"
+    path-type "^2.0.0"
+
+readable-stream@^1.1.8, readable-stream@~1.1.9:
+  version "1.1.14"
+  resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
+readable-stream@^2.2.2:
+  version "2.3.6"
+  resolved "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.3"
+    isarray "~1.0.0"
+    process-nextick-args "~2.0.0"
+    safe-buffer "~5.1.1"
+    string_decoder "~1.1.1"
+    util-deprecate "~1.0.1"
+
+redent@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/redent/download/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+  dependencies:
+    indent-string "^2.1.0"
+    strip-indent "^1.0.1"
+
+repeating@^2.0.0:
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/repeating/download/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+  dependencies:
+    is-finite "^1.0.0"
+
+request@^2.45.0, request@^2.79.0:
+  version "2.88.0"
+  resolved "http://registry.npm.taobao.org/request/download/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
+  dependencies:
+    aws-sign2 "~0.7.0"
+    aws4 "^1.8.0"
+    caseless "~0.12.0"
+    combined-stream "~1.0.6"
+    extend "~3.0.2"
+    forever-agent "~0.6.1"
+    form-data "~2.3.2"
+    har-validator "~5.1.0"
+    http-signature "~1.2.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.19"
+    oauth-sign "~0.9.0"
+    performance-now "^2.1.0"
+    qs "~6.5.2"
+    safe-buffer "^5.1.2"
+    tough-cookie "~2.4.3"
+    tunnel-agent "^0.6.0"
+    uuid "^3.3.2"
+
+resolve@^1.1.6:
+  version "1.8.1"
+  resolved "http://registry.npm.taobao.org/resolve/download/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
+  dependencies:
+    path-parse "^1.0.5"
+
+rimraf@^2.2.8:
+  version "2.6.2"
+  resolved "http://registry.npm.taobao.org/rimraf/download/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+  dependencies:
+    glob "^7.0.5"
+
+run-series@^1.1.1:
+  version "1.1.8"
+  resolved "http://registry.npm.taobao.org/run-series/download/run-series-1.1.8.tgz#2c4558f49221e01cd6371ff4e0a1e203e460fc36"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+  version "5.1.2"
+  resolved "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+  version "2.1.2"
+  resolved "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+sanitize-filename@^1.6.0:
+  version "1.6.1"
+  resolved "http://registry.npm.taobao.org/sanitize-filename/download/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a"
+  dependencies:
+    truncate-utf8-bytes "^1.0.0"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1:
+  version "5.6.0"
+  resolved "http://registry.npm.taobao.org/semver/download/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
+
+signal-exit@^3.0.0:
+  version "3.0.2"
+  resolved "http://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+single-line-log@^1.1.2:
+  version "1.1.2"
+  resolved "http://registry.npm.taobao.org/single-line-log/download/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364"
+  dependencies:
+    string-width "^1.0.1"
+
+spdx-correct@^3.0.0:
+  version "3.0.2"
+  resolved "http://registry.npm.taobao.org/spdx-correct/download/spdx-correct-3.0.2.tgz#19bb409e91b47b1ad54159243f7312a858db3c2e"
+  dependencies:
+    spdx-expression-parse "^3.0.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+  version "2.2.0"
+  resolved "http://registry.npm.taobao.org/spdx-exceptions/download/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
+
+spdx-expression-parse@^3.0.0:
+  version "3.0.0"
+  resolved "http://registry.npm.taobao.org/spdx-expression-parse/download/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+  dependencies:
+    spdx-exceptions "^2.1.0"
+    spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+  version "3.0.2"
+  resolved "http://registry.npm.taobao.org/spdx-license-ids/download/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2"
+
+speedometer@~0.1.2:
+  version "0.1.4"
+  resolved "http://registry.npm.taobao.org/speedometer/download/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d"
+
+sshpk@^1.7.0:
+  version "1.15.2"
+  resolved "http://registry.npm.taobao.org/sshpk/download/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629"
+  dependencies:
+    asn1 "~0.2.3"
+    assert-plus "^1.0.0"
+    bcrypt-pbkdf "^1.0.0"
+    dashdash "^1.12.0"
+    ecc-jsbn "~0.1.1"
+    getpass "^0.1.1"
+    jsbn "~0.1.0"
+    safer-buffer "^2.0.2"
+    tweetnacl "~0.14.0"
+
+string-width@^1.0.1:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
+string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+  dependencies:
+    safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0:
+  version "3.0.1"
+  resolved "http://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  dependencies:
+    ansi-regex "^2.0.0"
+
+strip-bom@^2.0.0:
+  version "2.0.0"
+  resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+  dependencies:
+    is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "http://registry.npm.taobao.org/strip-bom/download/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-indent@^1.0.1:
+  version "1.0.1"
+  resolved "http://registry.npm.taobao.org/strip-indent/download/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+  dependencies:
+    get-stdin "^4.0.1"
+
+strip-json-comments@~2.0.1:
+  version "2.0.1"
+  resolved "http://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+sumchecker@^1.2.0:
+  version "1.3.1"
+  resolved "http://registry.npm.taobao.org/sumchecker/download/sumchecker-1.3.1.tgz#79bb3b4456dd04f18ebdbc0d703a1d1daec5105d"
+  dependencies:
+    debug "^2.2.0"
+    es6-promise "^4.0.5"
+
+sumchecker@^2.0.2:
+  version "2.0.2"
+  resolved "http://registry.npm.taobao.org/sumchecker/download/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e"
+  dependencies:
+    debug "^2.2.0"
+
+throttleit@0.0.2:
+  version "0.0.2"
+  resolved "http://registry.npm.taobao.org/throttleit/download/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf"
+
+through2@~0.2.3:
+  version "0.2.3"
+  resolved "http://registry.npm.taobao.org/through2/download/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f"
+  dependencies:
+    readable-stream "~1.1.9"
+    xtend "~2.1.1"
+
+tmp@0.0.28:
+  version "0.0.28"
+  resolved "http://registry.npm.taobao.org/tmp/download/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120"
+  dependencies:
+    os-tmpdir "~1.0.1"
+
+touch@0.0.3:
+  version "0.0.3"
+  resolved "http://registry.npm.taobao.org/touch/download/touch-0.0.3.tgz#51aef3d449571d4f287a5d87c9c8b49181a0db1d"
+  dependencies:
+    nopt "~1.0.10"
+
+tough-cookie@~2.4.3:
+  version "2.4.3"
+  resolved "http://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
+  dependencies:
+    psl "^1.1.24"
+    punycode "^1.4.1"
+
+"traverse@>=0.3.0 <0.4":
+  version "0.3.9"
+  resolved "http://registry.npm.taobao.org/traverse/download/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9"
+
+trim-newlines@^1.0.0:
+  version "1.0.0"
+  resolved "http://registry.npm.taobao.org/trim-newlines/download/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+
+truncate-utf8-bytes@^1.0.0:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/truncate-utf8-bytes/download/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b"
+  dependencies:
+    utf8-byte-length "^1.0.1"
+
+tunnel-agent@^0.6.0:
+  version "0.6.0"
+  resolved "http://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  dependencies:
+    safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+  version "0.14.5"
+  resolved "http://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+typedarray@^0.0.6:
+  version "0.0.6"
+  resolved "http://registry.npm.taobao.org/typedarray/download/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+universalify@^0.1.0:
+  version "0.1.2"
+  resolved "http://registry.npm.taobao.org/universalify/download/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+
+uri-js@^4.2.2:
+  version "4.2.2"
+  resolved "http://registry.npm.taobao.org/uri-js/download/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+  dependencies:
+    punycode "^2.1.0"
+
+utf8-byte-length@^1.0.1:
+  version "1.0.4"
+  resolved "http://registry.npm.taobao.org/utf8-byte-length/download/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
+
+util-deprecate@~1.0.1:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+uuid@^3.3.2:
+  version "3.3.2"
+  resolved "http://registry.npm.taobao.org/uuid/download/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+
+validate-npm-package-license@^3.0.1:
+  version "3.0.4"
+  resolved "http://registry.npm.taobao.org/validate-npm-package-license/download/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+  dependencies:
+    spdx-correct "^3.0.0"
+    spdx-expression-parse "^3.0.0"
+
+verror@1.10.0:
+  version "1.10.0"
+  resolved "http://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+  dependencies:
+    assert-plus "^1.0.0"
+    core-util-is "1.0.2"
+    extsprintf "^1.2.0"
+
+wrappy@1:
+  version "1.0.2"
+  resolved "http://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+xmlbuilder@8.2.2:
+  version "8.2.2"
+  resolved "http://registry.npm.taobao.org/xmlbuilder/download/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773"
+
+xmlbuilder@^9.0.7:
+  version "9.0.7"
+  resolved "http://registry.npm.taobao.org/xmlbuilder/download/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
+
+xmldom@0.1.x:
+  version "0.1.27"
+  resolved "http://registry.npm.taobao.org/xmldom/download/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9"
+
+xtend@~2.1.1:
+  version "2.1.2"
+  resolved "http://registry.npm.taobao.org/xtend/download/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b"
+  dependencies:
+    object-keys "~0.4.0"
+
+yauzl@2.4.1:
+  version "2.4.1"
+  resolved "http://registry.npm.taobao.org/yauzl/download/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005"
+  dependencies:
+    fd-slicer "~1.0.1"

+ 5 - 0
frontend/saas-web/overrides/grid/Panel.js

@@ -0,0 +1,5 @@
+Ext.define('saas.override.grid.Panel', {
+    override: 'Ext.grid.Panel',
+
+    emptyText: '<div class="x-grid-empty-img"></div><div class="x-grid-empty-text">暂无数据</div>',
+});

+ 19 - 0
frontend/saas-web/overrides/grid/Panel.scss

@@ -0,0 +1,19 @@
+.x-grid-empty {
+    height: 90%;
+    max-height: 300px;
+
+    .x-grid-empty-img {
+        height: 100%;
+        max-height: 200px;
+        background: url(/resources/images/grid/empty.png) no-repeat;
+        background-position: center;
+    }
+    
+    .x-grid-empty-text {
+        font-size: 14px;
+        color: #BEBEBE;
+        letter-spacing: 0;
+        text-align: center;
+        line-height: 26px;
+    }
+}

+ 3 - 3
frontend/saas-web/package.json

@@ -6,9 +6,9 @@
   "scripts": {
     "test": "echo \"Error: no test specified\" && exit 1",
     "dev": "sencha app watch",
-    "build-dev": "sencha app build --development",
-    "build-test": "sencha app build --testing",
-    "build": "sencha app build --production"
+    "build-dev": "sencha app build --build dev --testing",
+    "build-test": "sencha app build --build test --production",
+    "build": "sencha app build --build prod --production"
   },
   "keywords": [
     "saas"

BIN
frontend/saas-web/resources/images/grid/empty.png


+ 12 - 4
frontend/saas-web/resources/json/navigation.json

@@ -173,10 +173,18 @@
             "id": "monry-report-accountbalance",
             "viewType":"monry-report-accountbalance"
         }, {
-                "text": "核销明细表",
-                "id": "monry-report-accountdetails",
-                "viewType":"monry-report-accountdetails"
-            }]
+            "text": "核销明细表",
+            "id": "monry-report-accountdetails",
+            "viewType":"monry-report-accountdetails"
+        }, {
+            "text": "应收总账明细表",
+            "id": "monry-report-totalrecdetail",
+            "viewType":"monry-report-totalrecdetail"
+        }, {
+            "text": "应付总账明细表",
+            "id": "monry-report-totalpaydetail",
+            "viewType":"monry-report-totalpaydetail"
+        }]
     }]
 }, {
     "text": "资料",