Bläddra i källkod

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper into master

seyason 1 år sedan
förälder
incheckning
1a15e5bbf4
40 ändrade filer med 2850 tillägg och 293 borttagningar
  1. 0 4
      .idea/shelf/Uncommitted_changes_before_Update_at_2022-04-19_16_43__Default_Changelist_.xml
  2. 8 28
      .idea/workspace.xml
  3. 20 10
      fhKeeper/formulahousekeeper/management-platform-import/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  4. 16 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DepartmentController.java
  5. 3 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/MaterialController.java
  6. 81 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanController.java
  7. 21 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanDeptController.java
  8. 36 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProdCategoryController.java
  9. 75 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProdMaterialController.java
  10. 76 2
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProdProcedureController.java
  11. 11 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProductController.java
  12. 176 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/Plan.java
  13. 37 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/PlanDept.java
  14. 53 7
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/ProdMaterial.java
  15. 28 13
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/ProdProcedure.java
  16. 16 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/mapper/PlanDeptMapper.java
  17. 16 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/mapper/PlanMapper.java
  18. 16 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/PlanDeptService.java
  19. 35 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/PlanService.java
  20. 6 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProdCategoryService.java
  21. 12 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProdMaterialService.java
  22. 12 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProdProcedureService.java
  23. 2 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProductService.java
  24. 20 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanDeptServiceImpl.java
  25. 410 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanServiceImpl.java
  26. 47 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProdCategoryServiceImpl.java
  27. 114 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProdMaterialServiceImpl.java
  28. 124 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProdProcedureServiceImpl.java
  29. 42 4
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  30. 0 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  31. 2 2
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/TaskProgressServiceImpl.java
  32. 0 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/util/MD5Util.java
  33. 16 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/PlanDeptMapper.xml
  34. 38 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/PlanMapper.xml
  35. 42 161
      fhKeeper/formulahousekeeper/timesheet-workshop/package-lock.json
  36. 8 3
      fhKeeper/formulahousekeeper/timesheet-workshop/src/routes.js
  37. 23 0
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/orderInsert.vue
  38. 576 0
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/today.vue
  39. 21 0
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/tomorrow.vue
  40. 611 56
      fhKeeper/formulahousekeeper/timesheet-workshop/src/views/product/list.vue

+ 0 - 4
.idea/shelf/Uncommitted_changes_before_Update_at_2022-04-19_16_43__Default_Changelist_.xml

@@ -1,4 +0,0 @@
-<changelist name="Uncommitted_changes_before_Update_at_2022-04-19_16_43_[Default_Changelist]" date="1650357829642" recycled="false" toDelete="true">
-  <option name="PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Update_at_2022-04-19_16_43_[Default_Changelist]/shelved.patch" />
-  <option name="DESCRIPTION" value="Uncommitted changes before Update at 2022-04-19 16:43 [Default Changelist]" />
-</changelist>

+ 8 - 28
.idea/workspace.xml

@@ -1,8 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="ChangeListManager">
-    <list default="true" id="2e06e18d-7f5e-4cbb-94ca-32a48e9e7e1f" name="Default Changelist" comment="" />
-    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <list default="true" id="2e06e18d-7f5e-4cbb-94ca-32a48e9e7e1f" name="Default Changelist" comment="gitignore" />
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -15,19 +14,6 @@
     <option name="testRunner" value="GRADLE" />
     <option name="delegatedBuild" value="true" />
   </component>
-  <component name="FileEditorManager">
-    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
-      <file pinned="false" current-in-tab="true">
-        <entry file="file://$PROJECT_DIR$/fhKeeper/formulahousekeeper/.gitignore">
-          <provider selected="true" editor-type-id="text-editor">
-            <state relative-caret-position="437">
-              <caret line="23" selection-start-line="23" selection-end-line="23" />
-            </state>
-          </provider>
-        </entry>
-      </file>
-    </leaf>
-  </component>
   <component name="Git.Settings">
     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
   </component>
@@ -60,6 +46,7 @@
     <option name="width" value="1190" />
     <option name="height" value="920" />
   </component>
+  <component name="ProjectId" id="2T3aGTVV4p290kiNh3VASlwQynm" />
   <component name="ProjectView">
     <navigator proportions="" version="1">
       <foldersAlwaysOnTop value="true" />
@@ -91,28 +78,20 @@
       <pane id="Scope" />
     </panes>
   </component>
+  <component name="ProjectViewState">
+    <option name="hideEmptyMiddlePackages" value="true" />
+    <option name="showLibraryContents" value="true" />
+  </component>
   <component name="PropertiesComponent">
     <property name="ASKED_SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
     <property name="SHARE_PROJECT_CONFIGURATION_FILES" value="true" />
     <property name="WebServerToolWindowFactoryState" value="false" />
     <property name="aspect.path.notification.shown" value="true" />
-    <property name="last_opened_file_path" value="$PROJECT_DIR$/fhKeeper/formulahousekeeper" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
     <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
     <property name="nodejs_npm_path_reset_for_default_project" value="true" />
     <property name="settings.editor.selected.configurable" value="MavenSettings" />
   </component>
-  <component name="RunDashboard">
-    <option name="ruleStates">
-      <list>
-        <RuleState>
-          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
-        </RuleState>
-        <RuleState>
-          <option name="name" value="StatusDashboardGroupingRule" />
-        </RuleState>
-      </list>
-    </option>
-  </component>
   <component name="SvnConfiguration">
     <configuration />
   </component>
@@ -125,6 +104,7 @@
       <updated>1577949023712</updated>
       <workItem from="1577949027501" duration="489000" />
       <workItem from="1577949544335" duration="24000" />
+      <workItem from="1690274124261" duration="12000" />
     </task>
     <task id="LOCAL-00001" summary="gitignore">
       <created>1577949176115</created>

+ 20 - 10
fhKeeper/formulahousekeeper/management-platform-import/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -4034,40 +4034,50 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                     cell =sheet.getRow(0).getCell(7);
                                     if(cell!=null&&(cell.getStringCellValue().contains("日期")||cell.getStringCellValue().contains("时间"))){
                                         row.getCell(7).setCellType(CellType.NUMERIC);
-                                        String format = sdf.format(row.getCell(7).getDateCellValue());
-                                        report.setPlate1(format);
+                                        if(row.getCell(7).getDateCellValue()!=null){
+                                            String format = sdf.format(row.getCell(7).getDateCellValue());
+                                            report.setPlate1(format);
+                                        }
                                     }else report.setPlate1(row.getCell(7).getStringCellValue());
                                 break;
                                 case 2:
                                     cell = sheet.getRow(0).getCell(8);
                                     if(cell!=null&&(cell.getStringCellValue().contains("日期")||cell.getStringCellValue().contains("时间"))){
                                         row.getCell(8).setCellType(CellType.NUMERIC);
-                                        String format =sdf.format(row.getCell(8).getDateCellValue());
-                                        report.setPlate2(dtf.format(LocalDate.parse(format, dtf)));
+                                        if(row.getCell(8).getDateCellValue()!=null){
+                                            String format = sdf.format(row.getCell(8).getDateCellValue());
+                                            report.setPlate2(format);
+                                        }
                                     }else  report.setPlate2(row.getCell(8).getStringCellValue());
                                 break;
                                 case 3:
                                     cell = sheet.getRow(0).getCell(9);
                                     if(cell!=null&&(cell.getStringCellValue().contains("日期")||cell.getStringCellValue().contains("时间"))){
                                         row.getCell(9).setCellType(CellType.NUMERIC);
-                                        String format = sdf.format(row.getCell(9).getDateCellValue());
-                                        report.setPlate3(format);
+                                        if(row.getCell(9).getDateCellValue()!=null){
+                                            String format = sdf.format(row.getCell(9).getDateCellValue());
+                                            report.setPlate3(format);
+                                        }
                                     }else  report.setPlate3(row.getCell(9).getStringCellValue());
                                 break;
                                 case 4:
                                     cell = sheet.getRow(0).getCell(10);
                                     if(cell!=null&&(cell.getStringCellValue().contains("日期")||cell.getStringCellValue().contains("时间"))){
                                         row.getCell(10).setCellType(CellType.NUMERIC);
-                                        String format = sdf.format(row.getCell(10).getDateCellValue());
-                                        report.setPlate4(format);
+                                        if(row.getCell(10).getDateCellValue()!=null){
+                                            String format = sdf.format(row.getCell(10).getDateCellValue());
+                                            report.setPlate4(format);
+                                        }
                                     }else  report.setPlate4(row.getCell(10).getStringCellValue());
                                 break;
                                 case 5:
                                     cell = sheet.getRow(0).getCell(11);
                                     if(cell!=null&&(cell.getStringCellValue().contains("日期")||cell.getStringCellValue().contains("时间"))){
                                         row.getCell(11).setCellType(CellType.NUMERIC);
-                                        String format = sdf.format(row.getCell(11).getDateCellValue());
-                                        report.setPlate5(format);
+                                        if(row.getCell(11).getDateCellValue()!=null){
+                                            String format = sdf.format(row.getCell(11).getDateCellValue());
+                                            report.setPlate4(format);
+                                        }
                                     }else  report.setPlate5(row.getCell(11).getStringCellValue());
                                 break;
                             }

+ 16 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/DepartmentController.java

@@ -4,7 +4,10 @@ package com.management.platform.controller;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.management.platform.entity.Department;
+import com.management.platform.entity.User;
 import com.management.platform.entity.vo.DepartmentVO;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.DepartmentService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +35,8 @@ public class DepartmentController {
     private DepartmentService departmentService;
     @Resource
     private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
     /**
      * 获取带有层级的部门列表
      */
@@ -147,5 +152,16 @@ public class DepartmentController {
     public HttpRespMsg exportCustomDataSum(String startDate, String endDate) {
         return departmentService.exportCustomDataSum(startDate, endDate, request);
     }
+    
+    @RequestMapping("/getIncharger")
+    public HttpRespMsg getIncharger(Integer deptId){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Department department = departmentService.getById(deptId);
+        if(department.getManagerId()!=null){
+            User user = userMapper.selectById(department.getManagerId());
+            httpRespMsg.setData(user);
+        }
+        return httpRespMsg;
+    }
 }
 

+ 3 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/MaterialController.java

@@ -1,6 +1,8 @@
 package com.management.platform.controller;
 
 
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
@@ -17,5 +19,6 @@ import org.springframework.web.bind.annotation.RestController;
 @RequestMapping("/material")
 public class MaterialController {
 
+
 }
 

+ 81 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanController.java

@@ -0,0 +1,81 @@
+package com.management.platform.controller;
+
+
+import com.management.platform.entity.Plan;
+import com.management.platform.service.PlanService;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-07-24
+ */
+@RestController
+@RequestMapping("/plan")
+public class PlanController {
+
+    @Resource
+    private PlanService planService;
+
+    @RequestMapping("/list")
+    public HttpRespMsg list(String date,String steelStampNumber,@RequestParam(defaultValue = "3") Integer planType,Integer deptId,Integer pageIndex,Integer pageSize){
+        return planService.getList(date,steelStampNumber,planType,deptId,pageIndex,pageSize);
+    }
+
+    @RequestMapping("/addOrUpdatePlan")
+    public HttpRespMsg addOrUpdatePlan(@RequestBody Plan plan){
+        return planService.addOrUpdatePlan(plan);
+    }
+
+    @RequestMapping("/planDetail")
+    public HttpRespMsg planDetail(Integer productSchedulingNum,@RequestParam(defaultValue = "0") Integer type){
+        return planService.planDetail(productSchedulingNum,type);
+    }
+
+    @RequestMapping("/allocationPlan")
+    public HttpRespMsg allocationPlan(String ids,Integer planType){
+        return planService.allocationPlan(ids,planType);
+    }
+
+    //设置今明日计划部门
+    @RequestMapping("/deptSet")
+    @Transactional
+    public HttpRespMsg deptSet(String deptIds){
+        return  planService.deptSet(deptIds);
+    }
+
+    @RequestMapping("/deptList")
+    public HttpRespMsg deptList(){
+        return planService.deptList();
+    }
+
+    @RequestMapping("/hasSetDeptDetail")
+    public HttpRespMsg hasSetDeptDetail(){
+        return planService.hasSetDeptDetail();
+    }
+
+    @RequestMapping("/importData")
+    public HttpRespMsg importData(MultipartFile file,Integer planType){
+        return planService.importData(file,planType);
+    }
+
+    @RequestMapping("/exportData")
+    public HttpRespMsg exportData(String date,Integer planType){
+        return planService.exportData(date,planType);
+    }
+
+}
+

+ 21 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/PlanDeptController.java

@@ -0,0 +1,21 @@
+package com.management.platform.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-07-24
+ */
+@RestController
+@RequestMapping("/plan-dept")
+public class PlanDeptController {
+
+}
+

+ 36 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProdCategoryController.java

@@ -1,15 +1,21 @@
 package com.management.platform.controller;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.management.platform.entity.ProdCategory;
+import com.management.platform.entity.User;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ProdCategoryService;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.web.bind.annotation.RequestMapping;
 
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 /**
  * <p>
@@ -30,11 +36,40 @@ public class ProdCategoryController {
     @Resource
     ProdCategoryService prodCategoryService;
 
+    @RequestMapping(value = "/getList",method = RequestMethod.POST)
+    public HttpRespMsg getList(){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        String token = request.getHeader("Token");
+        User user = userMapper.selectById(token);
+        List<ProdCategory> categoryList = prodCategoryService.list(
+                new LambdaQueryWrapper<ProdCategory>()
+                        .eq(user.getCompanyId() != null, ProdCategory::getCompanyId, user.getCompanyId())
+        );
+        httpRespMsg.data=categoryList;
+
+        return httpRespMsg;
+    }
     @RequestMapping("get")
-    private HttpRespMsg get(Integer id){
+    public HttpRespMsg get(Integer id){
         HttpRespMsg msg = new HttpRespMsg();
         msg.data = prodCategoryService.getById(id);
         return msg;
     }
+
+    @RequestMapping("saveOrUpdateInfo")
+    public HttpRespMsg update(ProdCategory prodCategory){
+        return  prodCategoryService.saveOrUpdateInfo(prodCategory,request);
+    }
+
+    /**
+     * 根据当前分类有没有产品判断是否可删除
+     * @param id
+     * @return
+     */
+    @RequestMapping("delete")
+    public HttpRespMsg delete(@RequestParam Integer id){
+        return prodCategoryService.delete(id);
+    }
+
 }
 

+ 75 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProdMaterialController.java

@@ -1,10 +1,24 @@
 package com.management.platform.controller;
 
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.management.platform.entity.ProdMaterial;
+import com.management.platform.entity.ProdMaterial;
+import com.management.platform.service.ProdMaterialService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
 /**
  * <p>
  *  前端控制器
@@ -16,6 +30,67 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/prod-material")
 public class ProdMaterialController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private ProdMaterialService prodMaterialService;
+
+    /**
+     * 获取产品的id物料列表
+     */
+    @RequestMapping("/getProdMaterialList")
+    public HttpRespMsg getProdMaterialList (@RequestParam Integer productId){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        List<String> versionList= (List<String>) prodMaterialService.getVersion(request,productId).getData();
+        HttpRespMsg info = prodMaterialService.getInfo(request, versionList.get(versionList.size() - 1), productId);
+        List<ProdMaterial> prodMaterialList= (List<ProdMaterial>) info.data;
+
+        HashMap<String,Object> map=new HashMap<>();
+        map.put("version",versionList.get(versionList.size() - 1));
+        map.put("prodMaterialList",prodMaterialList);
+        System.out.println(map);
+
+        httpRespMsg.data=map;
+        return httpRespMsg;
+    }
+
+    /**
+     * 新增、修改工序
+     */
+    @RequestMapping("/changeProdMaterial")
+    public HttpRespMsg changeProdMaterial ( Integer productId ,String version,  String  prodMaterials){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        ObjectMapper mapper = new ObjectMapper();
+        List<ProdMaterial> prodMaterialList= null;
+        try {
+            prodMaterialList = Arrays.asList(mapper.readValue(prodMaterials, ProdMaterial[].class));
+            return prodMaterialService.changeProdMaterial(request, prodMaterialList,productId,version);
+        } catch (IOException e) {
+            httpRespMsg.setError("data is error");
+            e.printStackTrace();
+        }
+        return httpRespMsg;
+    }
+
+
+    /**
+     * 是否可删除物料
+     * 查看该工序有没有被使用(计划中)
+     * TODO
+     */
+    @RequestMapping("/isDelete")
+    public HttpRespMsg isDeleteProdMaterial (Integer id){
+        return prodMaterialService.isDelete(request,id);
+    }
+
+    @RequestMapping("getVersions")
+    public HttpRespMsg getVersions(@RequestParam Integer productId){
 
+        return prodMaterialService.getVersion(request,productId);
+    }
+    @RequestMapping("getInfo")
+    public HttpRespMsg getInfo(@RequestParam String version,@RequestParam Integer productId){
+        return prodMaterialService.getInfo(request,version,productId);
+    }
 }
 

+ 76 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProdProcedureController.java

@@ -1,9 +1,20 @@
 package com.management.platform.controller;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.management.platform.entity.ProdProcedure;
+import com.management.platform.service.ProdProcedureService;
+import com.management.platform.util.HttpRespMsg;
+import com.sun.scenario.effect.impl.sw.java.JSWBlend_SRC_OUTPeer;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
 
 /**
  * <p>
@@ -16,6 +27,69 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @RequestMapping("/prod-procedure")
 public class ProdProcedureController {
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private ProdProcedureService prodProcedureService;
 
+    /**
+     * 获取产品的id工序列表
+     */
+    @RequestMapping("/getProdProcedureList")
+    public HttpRespMsg getProdProcedureList (@RequestParam Integer productId){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        List<String> versionList= (List<String>) prodProcedureService.getVersion(request,productId).getData();
+        HttpRespMsg info = prodProcedureService.getInfo(request, versionList.get(versionList.size() - 1), productId);
+        List<ProdProcedure> prodProcedureList= (List<ProdProcedure>) info.data;
+
+        HashMap<String,Object> map=new HashMap<>();
+        map.put("version",versionList.get(versionList.size() - 1));
+        map.put("prodProcedureList",prodProcedureList);
+        System.out.println(map);
+
+        httpRespMsg.data=map;
+        return httpRespMsg;
+    }
+
+    /**
+     * 新增、修改工序
+     */
+    @RequestMapping("/changeProdProcedure")
+    public HttpRespMsg changeProdProcedure ( Integer productId ,String version,  String  prodProcedures){
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        ObjectMapper mapper = new ObjectMapper();
+        List<ProdProcedure> prodProcedureList= null;
+        try {
+            prodProcedureList = Arrays.asList(mapper.readValue(prodProcedures, ProdProcedure[].class));
+            return prodProcedureService.changeProdProcedure(request, prodProcedureList,productId,version);
+        } catch (IOException e) {
+            httpRespMsg.setError("data is error");
+            e.printStackTrace();
+        }
+        return httpRespMsg;
+    }
+
+
+    /**
+     * 是否可删除工序
+     * 查看该工序有没有被使用(计划中)
+     * TODO
+     */
+    @RequestMapping("/isDelete")
+    public HttpRespMsg isDeleteProdProcedure (Integer id){
+        return prodProcedureService.isDelete(request,id);
+    }
+
+    @RequestMapping("getVersions")
+    public HttpRespMsg getVersions(@RequestParam Integer productId){
+
+        return prodProcedureService.getVersion(request,productId);
+
+    }
+
+    @RequestMapping("getInfo")
+    public HttpRespMsg getInfo(@RequestParam String version,@RequestParam Integer productId){
+        return prodProcedureService.getInfo(request,version,productId);
+    }
 }
 

+ 11 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProductController.java

@@ -56,5 +56,16 @@ public class ProductController {
         productService.removeById(id);
         return msg;
     }
+
+    /**
+     * 查询产品详情
+     * @param id
+     * @return
+     * Todo
+     */
+    @RequestMapping("getInfo")
+    public HttpRespMsg getInfo(Integer id){
+        return productService.getProductInfo(request,id);
+    }
 }
 

+ 176 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/Plan.java

@@ -0,0 +1,176 @@
+package com.management.platform.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.time.LocalDate;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-07-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class Plan extends Model<Plan> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 排产工单号
+     */
+    @TableField("product_scheduling_num")
+    private String productSchedulingNum;
+
+    /**
+     * 产品ID
+     */
+    @TableField("product_id")
+    private Integer productId;
+
+    /**
+     * 产品名称
+     */
+    @TableField("product_name")
+    private String productName;
+
+    /**
+     * 项目代码
+     */
+    @TableField("project_code")
+    private String projectCode;
+
+    /**
+     * 公司ID
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 钢印号
+     */
+    @TableField("steel_stamp_number_start")
+    private String steelStampNumberStart;
+
+    /**
+     * 钢印号
+     */
+    @TableField("steel_stamp_number_end")
+    private String steelStampNumberEnd;
+
+    /**
+     * 数量
+     */
+    @TableField("num")
+    private Integer num;
+
+    /**
+     * 主工序
+     */
+    @TableField("main_process")
+    private String mainProcess;
+
+    /**
+     * 工位
+     */
+    @TableField("station_id")
+    private Integer stationId;
+
+    /**
+     * 工位名称
+     */
+    @TableField("station_name")
+    private String stationName;
+
+    /**
+     * 工长
+     */
+    @TableField("foreman_id")
+    private Integer foremanId;
+
+    /**
+     * 工长
+     */
+    @TableField("foreman_name")
+    private String foremanName;
+
+    /**
+     * 计划类型 0-今日计划 1-明日计划 2-插单计划
+     */
+    @TableField("plan_type")
+    private Integer planType;
+
+    /**
+     * 计划日期
+     */
+    @TableField("plan_date")
+    private LocalDate planDate;
+
+    /**
+     * 开工时间
+     */
+    @TableField("start_date")
+    private LocalDate startDate;
+
+    /**
+     * 完工时间
+     */
+    @TableField("end_date")
+    private LocalDate endDate;
+
+    /**
+     * 任务名称
+     */
+    @TableField("task_name")
+    private String taskName;
+
+    /**
+     * 任务类型ID
+     */
+    @TableField("task_type_id")
+    private Integer taskTypeId;
+
+    /**
+     * 任务变更通知号
+     */
+    @TableField("task_change_notice_num")
+    private String taskChangeNoticeNum;
+
+    /**
+     * 计划工时
+     */
+    @TableField("plan_work_hour")
+    private Double planWorkHour;
+
+    /**
+     * 工钱
+     */
+    @TableField("money_of_job")
+    private BigDecimal moneyOfJob;
+
+    /**
+     * 描述
+     */
+    @TableField("describtion")
+    private String describtion;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+}

+ 37 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/PlanDept.java

@@ -0,0 +1,37 @@
+package com.management.platform.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-07-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class PlanDept extends Model<PlanDept> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    @TableField("dept_id")
+    private Integer deptId;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return null;
+    }
+
+}

+ 53 - 7
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/ProdMaterial.java

@@ -27,17 +27,62 @@ public class ProdMaterial extends Model<ProdMaterial> {
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
-    @TableField("prod_id")
-    private Integer prodId;
+    @TableField("name")
+    private String name;
 
-    @TableField("material_id")
-    private Integer materialId;
+    /**
+     * 所属公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 产品id
+     */
+    @TableField("product_id")
+    private Integer productId;
+
+    /**
+     * 公司编码
+     */
+    @TableField("company_code")
+    private Integer companyCode;
+
+    /**
+     * 公司图号
+     */
+    @TableField("company_drawing_no")
+    private Integer companyDrawingNo;
+
+    /**
+     * 材质
+     */
+    @TableField("material_quality")
+    private String materialQuality;
+
+    /**
+     * 厚度
+     */
+    @TableField("thickness")
+    private Double thickness;
+
+    /**
+     * 数量(个/产品)
+     */
+    @TableField("number_product")
+    private Integer numberProduct;
+
+    /**
+     * 数量(个/辆)
+     */
+    @TableField("number_vehicle")
+    private Integer numberVehicle;
 
     /**
-     * 数量
+     * 版本号
      */
-    @TableField("num")
-    private Integer num;
+    @TableField("version_number")
+    private String versionNumber;
 
 
     @Override
@@ -45,4 +90,5 @@ public class ProdMaterial extends Model<ProdMaterial> {
         return this.id;
     }
 
+
 }

+ 28 - 13
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/ProdProcedure.java

@@ -23,28 +23,32 @@ import lombok.experimental.Accessors;
 @Accessors(chain = true)
 public class ProdProcedure extends Model<ProdProcedure> {
 
-    private static final long serialVersionUID=1L;
-
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
-    @TableField("prod_id")
-    private Integer prodId;
+    /**
+     * 工序名称
+     */
+    @TableField("name")
+    private String name;
 
-    @TableField("procedure_id")
-    private Integer procedureId;
+    /**
+     * 所属公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
 
     /**
-     * 工序类型:0-大工序,1-工序
+     * 所属产品id
      */
-    @TableField("proced_type")
-    private Integer procedType;
+    @TableField("product_id")
+    private Integer productId;
 
     /**
-     * 单价:单位元
+     * 单间工
      */
-    @TableField("price")
-    private BigDecimal price;
+    @TableField("unit_price")
+    private BigDecimal unitPrice;
 
     /**
      * 质检类型:0-自检,1-互检,2-专检
@@ -52,10 +56,21 @@ public class ProdProcedure extends Model<ProdProcedure> {
     @TableField("check_type")
     private Integer checkType;
 
+    /**
+     * 单件工时
+     */
+    @TableField("working_time")
+    private Double workingTime;
+
+    /**
+     * 版本号
+     */
+    @TableField("version_number")
+    private String versionNumber;
+
 
     @Override
     protected Serializable pkVal() {
         return this.id;
     }
-
 }

+ 16 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/mapper/PlanDeptMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.PlanDept;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-07-24
+ */
+public interface PlanDeptMapper extends BaseMapper<PlanDept> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/mapper/PlanMapper.java

@@ -0,0 +1,16 @@
+package com.management.platform.mapper;
+
+import com.management.platform.entity.Plan;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-07-24
+ */
+public interface PlanMapper extends BaseMapper<Plan> {
+
+}

+ 16 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/PlanDeptService.java

@@ -0,0 +1,16 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.PlanDept;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-07-24
+ */
+public interface PlanDeptService extends IService<PlanDept> {
+
+}

+ 35 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/PlanService.java

@@ -0,0 +1,35 @@
+package com.management.platform.service;
+
+import com.management.platform.entity.Plan;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-07-24
+ */
+public interface PlanService extends IService<Plan> {
+
+    HttpRespMsg getList(String date, String steelStampNumber, Integer planType,Integer deptId,Integer pageIndex,Integer pageSize);
+
+    HttpRespMsg addOrUpdatePlan(Plan plan);
+
+    HttpRespMsg allocationPlan(String ids,Integer planType);
+
+    HttpRespMsg importData(MultipartFile multipartFile, Integer planType);
+
+    HttpRespMsg exportData(String date, Integer planType);
+
+    HttpRespMsg deptSet(String deptIds);
+
+    HttpRespMsg deptList();
+
+    HttpRespMsg planDetail(Integer productSchedulingNum, Integer type);
+
+    HttpRespMsg hasSetDeptDetail();
+}

+ 6 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProdCategoryService.java

@@ -2,6 +2,9 @@ package com.management.platform.service;
 
 import com.management.platform.entity.ProdCategory;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
+
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * <p>
@@ -13,4 +16,7 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ProdCategoryService extends IService<ProdCategory> {
 
+    HttpRespMsg saveOrUpdateInfo(ProdCategory prodCategory, HttpServletRequest request);
+
+    HttpRespMsg delete(Integer id);
 }

+ 12 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProdMaterialService.java

@@ -2,6 +2,11 @@ package com.management.platform.service;
 
 import com.management.platform.entity.ProdMaterial;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.entity.ProdProcedure;
+import com.management.platform.util.HttpRespMsg;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +18,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ProdMaterialService extends IService<ProdMaterial> {
 
+    HttpRespMsg getVersion(HttpServletRequest request, Integer productId);
+
+    HttpRespMsg getInfo(HttpServletRequest request, String version, Integer productId);
+
+    HttpRespMsg isDelete(HttpServletRequest request, Integer id);
+
+    HttpRespMsg changeProdMaterial(HttpServletRequest request, List<ProdMaterial> prodMaterialList, Integer productId, String version);
 }

+ 12 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProdProcedureService.java

@@ -2,6 +2,10 @@ package com.management.platform.service;
 
 import com.management.platform.entity.ProdProcedure;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.management.platform.util.HttpRespMsg;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +17,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ProdProcedureService extends IService<ProdProcedure> {
 
+
+    HttpRespMsg changeProdProcedure(HttpServletRequest request, List<ProdProcedure> ProdProcedureList,  Integer productId,String version);
+
+    HttpRespMsg isDelete(HttpServletRequest request, Integer deleteId);
+
+    HttpRespMsg getVersion(HttpServletRequest request, Integer productId);
+
+    HttpRespMsg getInfo(HttpServletRequest request, String version, Integer productId);
 }

+ 2 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProductService.java

@@ -19,4 +19,6 @@ public interface ProductService extends IService<Product> {
     HttpRespMsg getProductPage(Integer cateId, Integer pageIndex, Integer pageSize, String name, String code, HttpServletRequest request);
 
     HttpRespMsg saveProductInfo(Product product, HttpServletRequest request);
+
+    HttpRespMsg getProductInfo(HttpServletRequest request, Integer id);
 }

+ 20 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanDeptServiceImpl.java

@@ -0,0 +1,20 @@
+package com.management.platform.service.impl;
+
+import com.management.platform.entity.PlanDept;
+import com.management.platform.mapper.PlanDeptMapper;
+import com.management.platform.service.PlanDeptService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-07-24
+ */
+@Service
+public class PlanDeptServiceImpl extends ServiceImpl<PlanDeptMapper, PlanDept> implements PlanDeptService {
+
+}

+ 410 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/PlanServiceImpl.java

@@ -0,0 +1,410 @@
+package com.management.platform.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.entity.*;
+import com.management.platform.entity.vo.SysRichFunction;
+import com.management.platform.mapper.*;
+import com.management.platform.service.PlanDeptService;
+import com.management.platform.service.PlanService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.service.WxCorpInfoService;
+import com.management.platform.util.ExcelUtil;
+import com.management.platform.util.HttpRespMsg;
+import com.management.platform.util.MessageUtils;
+import org.apache.poi.EncryptedDocumentException;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.CellType;
+import org.apache.poi.xssf.usermodel.XSSFCell;
+import org.apache.poi.xssf.usermodel.XSSFRow;
+import org.apache.poi.xssf.usermodel.XSSFSheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.*;
+import java.math.BigDecimal;
+import java.sql.Wrapper;
+import java.text.SimpleDateFormat;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author Seyason
+ * @since 2023-07-24
+ */
+@Service
+public class PlanServiceImpl extends ServiceImpl<PlanMapper, Plan> implements PlanService {
+
+    @Resource
+    private PlanMapper planMapper;
+    @Resource
+    private WxCorpInfoService wxCorpInfoService;
+    @Resource
+    private HttpServletRequest request;
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private PlanDeptMapper planDeptMapper;
+    @Resource
+    private PlanDeptService planDeptService;
+    @Resource
+    private DepartmentMapper departmentMapper;
+    @Resource
+    private ProdMaterialMapper prodMaterialMapper;
+    @Resource
+    private ProdProcedureMapper prodProcedureMapper;
+    @Resource
+    private ProductMapper productMapper;
+
+    @Override
+    public HttpRespMsg getList(String date, String steelStampNumber, Integer planType,Integer deptId,Integer pageIndex,Integer pageSize) {
+        HttpRespMsg msg=new HttpRespMsg();
+        QueryWrapper<Plan> queryWrapper=new QueryWrapper();
+        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        queryWrapper.eq("plan_type",planType);
+        if(planType!=2){
+            queryWrapper.eq("station_id",deptId);
+        }
+        if(!StringUtils.isEmpty(date)){
+            LocalDate parse = LocalDate.parse(date,df);
+            queryWrapper.eq("plan_date",parse);
+        }else {
+            LocalDate now = LocalDate.now();
+            queryWrapper.eq("plan_date",planType==0?now:now.plusDays(1));
+        }
+        if(!StringUtils.isEmpty(steelStampNumber)){
+            queryWrapper.gt("steel_stamp_number_start",steelStampNumber);
+            queryWrapper.lt("steel_stamp_number_end",steelStampNumber);
+        }
+        IPage<Plan> planIPage = planMapper.selectPage(new Page<>(pageIndex, pageSize), queryWrapper);
+        Map map=new HashMap();
+        map.put("total",planIPage.getTotal());
+        map.put("records",planIPage.getRecords());
+        msg.setData(map);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg addOrUpdatePlan(Plan plan) {
+        HttpRespMsg msg=new HttpRespMsg();
+        if(plan.getId()==null){
+            if(count(new QueryWrapper<Plan>().eq("product_scheduling_num",plan.getProductSchedulingNum()))>0){
+                msg.setError("当前排产工单号已存在");
+                return msg;
+            }
+            switch (plan.getPlanType()){
+                case 0:
+                    plan.setPlanDate(LocalDate.now());
+                    break;
+                case 1:
+                    plan.setPlanDate(LocalDate.now().plusDays(1));
+                    break;
+            }
+            if(planMapper.insert(plan)<0){
+                msg.setError("验证失败");
+                return msg;
+            }
+        }else {
+            if(planMapper.updateById(plan)<0){
+                msg.setError("验证失败");
+                return msg;
+            }
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg allocationPlan(String ids,Integer planType) {
+        HttpRespMsg msg=new HttpRespMsg();
+        List<String> idList = Arrays.asList(ids.split(","));
+        List<Plan> planList = planMapper.selectBatchIds(idList);
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<WxCorpInfo> wxCorpInfoList = wxCorpInfoService.list(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        if(wxCorpInfoList.size()>0){
+            WxCorpInfo wxCorpInfo = wxCorpInfoList.get(0);
+            List<Integer> foremanIds = planList.stream().map(Plan::getForemanId).distinct().collect(Collectors.toList());
+            List<User> userList = userMapper.selectBatchIds(foremanIds);
+            for (Plan plan : planList) {
+                Optional<User> first = userList.stream().filter(ul -> ul.getId().equals(plan.getForemanId())).findFirst();
+                if(first.isPresent()){
+                    //推送到企业微信
+                    JSONObject json=new JSONObject();
+                    JSONArray dataJson=new JSONArray();
+                    JSONObject jsonObj=new JSONObject();
+                    jsonObj.put("key",planType==0?"今日计划":planType==1?"明日计划":"插单计划");
+                    jsonObj.put("value",planType==2?"任务名称"+plan.getTaskName()+"\n"+"任务变更通知号"+plan.getTaskChangeNoticeNum():"产品名称"+plan.getProductName()+"\n"+"排产工单号"+plan.getProductSchedulingNum());
+                    dataJson.add(jsonObj);
+                    //todo:配置消息模板以及推送后入口
+                    json.put("template_id","tty9TkCAAALUiWvjdoDg_PZf48gwucZA");
+                    json.put("url","https://open.weixin.qq.com/connect/oauth2/authorize?appid=ww4e237fd6abb635af&redirect_uri=http://worktime.ttkuaiban.com/api/corpWXAuth&response_type=code&scope=snsapi_base&state=expense#wechat_redirect");
+                    json.put("content_item",dataJson);
+                    wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo,first.get().getCorpwxUserid(), json);
+                }else msg.setError("验证失败");
+            }
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg importData(MultipartFile multipartFile, Integer planType) {
+        HttpRespMsg msg=new HttpRespMsg();
+        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String fileName = multipartFile.getOriginalFilename();
+        File file = new File(fileName == null ? "file" : fileName);
+        InputStream inputStream = null;
+        OutputStream outputStream = null;
+        try {
+            inputStream = multipartFile.getInputStream();
+            outputStream = new FileOutputStream(file);
+            byte[] buffer = new byte[4096];
+            int temp = 0;
+            while ((temp = inputStream.read(buffer, 0, 4096)) != -1) {
+                outputStream.write(buffer, 0, temp);
+            }
+            inputStream.close();
+            outputStream.close();
+            //然后解析表格
+            XSSFWorkbook workbook = new XSSFWorkbook(file);
+            //我们只需要第一个sheet
+            XSSFSheet sheet = workbook.getSheetAt(0);
+            int rowNum = sheet.getLastRowNum();
+            //获取相关数据
+            Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+            List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
+            List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
+            List<Product> productList = productMapper.selectList(new QueryWrapper<Product>().eq("company_id", companyId));
+            List<Plan> needInsertList=new ArrayList<>();
+            for (int rowIndex = 1; rowIndex <= rowNum; rowIndex++) {
+                XSSFRow row = sheet.getRow(rowIndex);
+                if (row == null) {
+                    continue;
+                }
+                //跳过空行
+                if (ExcelUtil.isRowEmpty(row)) {
+                    continue;
+                }
+                //部门 排产工单号 产品名称 钢印号 数量 主工序 工位 开工时间 完工时间 描述
+                XSSFCell deptCell = row.getCell(0);
+                XSSFCell productSchedulingNumCell = row.getCell(1);
+                XSSFCell productNameCell = row.getCell(2);
+                XSSFCell steelStampNumberCell = row.getCell(3);
+                XSSFCell numCell = row.getCell(4);
+                XSSFCell mainProcessCell = row.getCell(5);
+                XSSFCell stationNameCell = row.getCell(6);
+                XSSFCell startDateCell = row.getCell(7);
+                XSSFCell endDateCell = row.getCell(8);
+                XSSFCell describtionCell = row.getCell(9);
+
+                if (deptCell != null) deptCell.setCellType(CellType.STRING);
+                if (productSchedulingNumCell != null) productSchedulingNumCell.setCellType(CellType.NUMERIC);
+                if (productNameCell != null) productNameCell.setCellType(CellType.STRING);
+                if (steelStampNumberCell != null) steelStampNumberCell.setCellType(CellType.STRING);
+                if (numCell != null) numCell.setCellType(CellType.NUMERIC);
+                if (mainProcessCell != null) mainProcessCell.setCellType(CellType.STRING);
+                if (stationNameCell != null) stationNameCell.setCellType(CellType.STRING);
+                if (startDateCell != null) startDateCell.setCellType(CellType.NUMERIC);
+                if (endDateCell != null) endDateCell.setCellType(CellType.NUMERIC);
+                if (describtionCell != null) describtionCell.setCellType(CellType.STRING);
+                Plan plan=new Plan();
+                plan.setPlanDate(planType==0?LocalDate.now():LocalDate.now().plusDays(1));
+                if(deptCell!=null){
+                    Optional<Department> first = departmentList.stream().filter(dl -> dl.getDepartmentName().equals(deptCell.getStringCellValue())).findFirst();
+                    if(first.isPresent()){
+                        plan.setStationId(first.get().getDepartmentId());
+                        plan.setStationName(first.get().getDepartmentName());
+                    }else {
+                        msg.setError("部门["+deptCell.getStringCellValue()+"]不存在");
+                        return msg;
+                    }
+                }else {
+                    msg.setError("部门不能为空");
+                    return msg;
+                }
+                if(productSchedulingNumCell!=null){
+                    if(count(new QueryWrapper<Plan>().eq("product_scheduling_num",productSchedulingNumCell.getStringCellValue()))>0){
+                        msg.setError("已存在的排产工单号"+productSchedulingNumCell.getStringCellValue());
+                        return msg;
+                    }
+                    plan.setProductSchedulingNum(productSchedulingNumCell.getStringCellValue());
+                }
+                if(productNameCell!=null){
+                    Optional<Product> first = productList.stream().filter(pl -> pl.getName().equals(productNameCell.getStringCellValue())).findFirst();
+                    if(first.isPresent()){
+                        plan.setProductId(first.get().getId());
+                        plan.setProductName(first.get().getName());
+                    }else {
+                        msg.setError("产品["+productNameCell.getStringCellValue()+"]不存在");
+                        return msg;
+                    }
+                }
+                if(steelStampNumberCell!=null){
+                    String value = steelStampNumberCell.getStringCellValue();
+                    String[] split = value.split("-");
+                    if(split.length>1){
+                        plan.setSteelStampNumberStart(split[0]);
+                        plan.setSteelStampNumberEnd(split[1]);
+                    }
+                }
+                plan.setNum(numCell==null?0:Integer.valueOf(String.valueOf(numCell.getNumericCellValue())));
+                plan.setMainProcess(mainProcessCell==null?"":mainProcessCell.getStringCellValue());
+                if(stationNameCell!=null){
+                    Optional<Department> first = departmentList.stream().filter(dl -> dl.getDepartmentName().equals(stationNameCell.getStringCellValue())).findFirst();
+                    if(first.isPresent()){
+                        if(!first.get().getSuperiorId().equals(plan.getStationId())){
+                            msg.setError("工位["+stationNameCell.getStringCellValue()+"]不属于部门["+deptCell.getStringCellValue()+"]");
+                            return msg;
+                        }
+                        plan.setStationId(first.get().getDepartmentId());
+                        plan.setStationName(first.get().getDepartmentName());
+                    }else {
+                        msg.setError("工位["+stationNameCell.getStringCellValue()+"]不存在");
+                        return msg;
+                    }
+                }
+                if(startDateCell!=null){
+                    plan.setStartDate(LocalDate.parse(startDateCell.getDateCellValue().toString(),df));
+                }
+                if(endDateCell!=null){
+                    plan.setEndDate(LocalDate.parse(endDateCell.getDateCellValue().toString(),df));
+                }
+                plan.setDescribtion(describtionCell==null?"":describtionCell.getStringCellValue());
+                needInsertList.add(plan);
+            }
+            if(needInsertList.size()>0){
+                saveBatch(needInsertList);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (NullPointerException e) {
+            e.printStackTrace();
+            //msg.setError("数据格式有误或存在空数据 导入失败");
+            msg.setError(MessageUtils.message("file.dataFormatError"));
+            return msg;
+        } catch (InvalidFormatException e) {
+            e.printStackTrace();
+            //msg.setError("文件格式错误,如果安装了加密软件需要先解密再上传");
+            msg.setError(MessageUtils.message("file.FormatErrorAndDecrypt"));
+        } catch (EncryptedDocumentException e) {
+            e.printStackTrace();
+            //msg.setError("文件加密状态,需要先解除加密状态再上传");
+            msg.setError(MessageUtils.message("file.encryption"));
+            return msg;
+        } catch (Exception e) {
+            e.printStackTrace();
+            //msg.setError("上传失败:" + e.getMessage());
+            msg.setError(MessageUtils.message("file.uploadError",e.getMessage()));
+            return msg;
+        } finally {
+            //关闭流
+            try {
+                if (outputStream != null && inputStream != null) {
+                    outputStream.close();
+                    inputStream.close();
+                    System.out.println("流已关闭");
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+//            file.deleteOnExit();//程序退出时删除临时文件
+            System.out.println(file.delete());
+        }
+        return null;
+    }
+
+    @Override
+    public HttpRespMsg exportData(String date, Integer planType) {
+        return null;
+    }
+
+    @Override
+    public HttpRespMsg deptList() {
+        HttpRespMsg msg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<PlanDept> planDeptList = planDeptService.list(new QueryWrapper<PlanDept>().eq("company_id", companyId));
+        List<Integer> deptIds = planDeptList.stream().map(PlanDept::getDeptId).distinct().collect(Collectors.toList());
+        msg.setData(org.apache.commons.lang3.StringUtils.join(deptIds,","));
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg hasSetDeptDetail() {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        List<PlanDept> planDeptList = planDeptService.list(new QueryWrapper<PlanDept>().eq("company_id", companyId));
+        List<Integer> deptIds = planDeptList.stream().map(PlanDept::getDeptId).distinct().collect(Collectors.toList());
+        deptIds.add(-1);
+        List<Department> departmentList = departmentMapper.selectBatchIds(deptIds);
+        httpRespMsg.setData(departmentList);
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg planDetail(Integer productSchedulingNum, Integer type) {
+        HttpRespMsg msg=new HttpRespMsg();
+        Plan plan = planMapper.selectOne(new QueryWrapper<Plan>().eq("product_scheduling_num", productSchedulingNum));
+        if(plan!=null){
+            switch (type){
+                case 0:
+                    List<ProdProcedure> prodProcedureList = prodProcedureMapper.selectList(new QueryWrapper<ProdProcedure>().eq("product_id", plan.getProductId()));
+                    msg.setData(prodProcedureList);
+                    break;
+                case 1:
+                    List<ProdMaterial> prodMaterialList = prodMaterialMapper.selectList(new QueryWrapper<ProdMaterial>().eq("product_id", plan.getProductId()));
+                    msg.setData(prodMaterialList);
+                    break;
+            }
+        }
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg deptSet(String deptIds) {
+        HttpRespMsg msg=new HttpRespMsg();
+        List<String> deptIdList = Arrays.asList(deptIds.split(","));
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        //已经保存了的部门设置 删除之前 部门下不存在计划数据的部门
+        List<PlanDept> allPlanDept = planDeptMapper.selectList(new QueryWrapper<PlanDept>().eq("company_id", companyId));
+        if(allPlanDept.size()>0){
+            List<Integer> allDeptIds = allPlanDept.stream().map(PlanDept::getDeptId).distinct().collect(Collectors.toList());
+            for (Integer allDeptId : allDeptIds) {
+                if(planMapper.selectCount(new QueryWrapper<Plan>().eq("dept_id",allDeptId))<=0){
+                    Map map=new HashMap();
+                    map.put("company_id",companyId);
+                    map.put("dept_id",allDeptId);
+                    planDeptMapper.deleteByMap(map);
+                }
+            }
+        }
+        List<PlanDept> afterRemoveDept = planDeptMapper.selectList(new QueryWrapper<PlanDept>().eq("company_id", companyId));
+        List<PlanDept> planDeptList=new ArrayList<>();
+        deptIdList.forEach(dl->{
+            PlanDept planDept=new PlanDept();
+            planDept.setCompanyId(companyId);
+            planDept.setDeptId(Integer.valueOf(dl));
+            if(!afterRemoveDept.contains(planDept)){
+                planDeptList.add(planDept);
+            }
+        });
+        if(!planDeptService.saveBatch(planDeptList)){
+            msg.setError("验证失败");
+        }
+        return msg;
+    }
+}

+ 47 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProdCategoryServiceImpl.java

@@ -1,11 +1,20 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.management.platform.entity.ProdCategory;
+import com.management.platform.entity.Product;
+import com.management.platform.entity.User;
 import com.management.platform.mapper.ProdCategoryMapper;
+import com.management.platform.mapper.ProductMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ProdCategoryService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.HttpRespMsg;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * <p>
  *  服务实现类
@@ -16,5 +25,43 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class ProdCategoryServiceImpl extends ServiceImpl<ProdCategoryMapper, ProdCategory> implements ProdCategoryService {
+    @Resource
+    private UserMapper userMapper;
+    @Resource
+    private ProdCategoryMapper prodCategoryMapper;
+    @Resource
+    private ProductMapper productMapper;
+
+    @Override
+    public HttpRespMsg saveOrUpdateInfo(ProdCategory prodCategory, HttpServletRequest request) {
+        String token = request.getHeader("Token");
+        User user = userMapper.selectById(token);
+        prodCategory.setCompanyId(user.getCompanyId());
+        if(prodCategory.getId()==null){
+            prodCategoryMapper.insert(prodCategory);
+        }else{
+            prodCategoryMapper.updateById(prodCategory);
+        }
+        HttpRespMsg msg = new HttpRespMsg();
+        System.out.println(prodCategory);
+        msg.setData(prodCategory);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg delete(Integer id) {
+        HttpRespMsg msg=new HttpRespMsg();
+
+        Integer count = productMapper.selectCount(
+                new LambdaQueryWrapper<Product>()
+                        .eq(id != null, Product::getCategoryId, id)
+        );
+        if(count==0){
+            prodCategoryMapper.deleteById(id);
+        }else{
+            msg.setError("category is used");
+        }
 
+        return msg;
+    }
 }

+ 114 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProdMaterialServiceImpl.java

@@ -1,11 +1,23 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.ProdMaterial;
+import com.management.platform.entity.ProdMaterial;
+import com.management.platform.entity.User;
 import com.management.platform.mapper.ProdMaterialMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ProdMaterialService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  *  服务实现类
@@ -16,5 +28,107 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class ProdMaterialServiceImpl extends ServiceImpl<ProdMaterialMapper, ProdMaterial> implements ProdMaterialService {
+    @Resource
+    private ProdMaterialMapper prodMaterialMapper;
+    @Resource
+    private UserMapper userMapper;
+    @Override
+    public HttpRespMsg getVersion(HttpServletRequest request, Integer productId) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        List<ProdMaterial> prodMaterialVersions = prodMaterialMapper.selectList(
+                new QueryWrapper<ProdMaterial>()
+                        .select("DISTINCT version_number")
+                        .lambda()
+                        .eq(productId != null, ProdMaterial::getProductId, productId)
+        );
+        List<String> versionList = prodMaterialVersions.stream().map(prodMaterial -> prodMaterial.getVersionNumber()).collect(Collectors.toList());
+        httpRespMsg.data=versionList;
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg getInfo(HttpServletRequest request, String version, Integer productId) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<ProdMaterial> prodMaterialList = prodMaterialMapper.selectList(
+                new LambdaQueryWrapper<ProdMaterial>()
+                        .eq(user.getCompanyId() != null, ProdMaterial::getCompanyId, user.getCompanyId())
+                        .eq(StringUtils.isNotBlank(version), ProdMaterial::getVersionNumber, version)
+                        .eq(productId != null, ProdMaterial::getProductId, productId)
+
+        );
+        httpRespMsg.data=prodMaterialList;
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg isDelete(HttpServletRequest request, Integer id) {
+        HttpRespMsg msg = new HttpRespMsg();
+        //TODO: 检查工序是否已经被使用,被使用的不能删除
+
+        boolean flag=true;
+        msg.setData(flag);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg changeProdMaterial(HttpServletRequest request, List<ProdMaterial> prodMaterialList, Integer productId, String version) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+
+        prodMaterialList.stream().forEach(prodMaterial -> {
+            user.getCompanyId();
+            prodMaterial.setCompanyId(user.getCompanyId());
+            prodMaterial.setProductId(productId);
+            prodMaterial.setVersionNumber(version);
+
+        });
+
+
+        //1.获取原有的工序id
+        List<ProdMaterial> oldList = prodMaterialMapper.selectList(new LambdaQueryWrapper<ProdMaterial>()
+                .eq(user.getCompanyId() != null, ProdMaterial::getCompanyId, user.getCompanyId())
+                .eq(productId != null, ProdMaterial::getProductId, productId)
+                .eq(StringUtils.isNotBlank(version),ProdMaterial::getVersionNumber,version)
+                .select(ProdMaterial::getId)
+        );
+
+        if(oldList!=null&&oldList.size()>0){
+            //2.要删除的id
+            List<ProdMaterial> deleteList = oldList.stream().filter(old -> {
+                for (ProdMaterial prodMaterial : prodMaterialList) {
+                    if (prodMaterial.getId() == old.getId()) {
+                        return false;
+                    }
+                }
+                return true;
+
+            }).collect(Collectors.toList());
+            if (deleteList != null && deleteList.size() > 0) {
+                List<Integer> deleteIdList = deleteList.stream().map(delete -> delete.getId()).collect(Collectors.toList());
+
+                prodMaterialMapper.deleteBatchIds(deleteIdList);
+            }
+
+            //3.编辑的id
+            List<ProdMaterial> updateList = prodMaterialList.stream().filter(prodMaterial -> prodMaterial.getId() != null).collect(Collectors.toList());
+            if (updateList != null&&updateList.size()>0) {
+                this.updateBatchById(updateList);
+            }
+            //4.新增的id
+            List<ProdMaterial> insertList = prodMaterialList.stream().filter(prodMaterial -> prodMaterial.getId() == null).collect(Collectors.toList());
+            if (insertList != null&&insertList.size()>0) {
+                this.saveBatch(insertList);
+            }
+        }else{
+
+            this.saveBatch(prodMaterialList);
+        }
+
+
 
+        return msg;
+    }
 }

+ 124 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProdProcedureServiceImpl.java

@@ -1,11 +1,22 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.ProdProcedure;
+import com.management.platform.entity.User;
 import com.management.platform.mapper.ProdProcedureMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.ProdProcedureService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.management.platform.util.HttpRespMsg;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  *  服务实现类
@@ -17,4 +28,117 @@ import org.springframework.stereotype.Service;
 @Service
 public class ProdProcedureServiceImpl extends ServiceImpl<ProdProcedureMapper, ProdProcedure> implements ProdProcedureService {
 
+    @Resource
+    private ProdProcedureMapper prodProcedureMapper;
+    @Resource
+    private UserMapper userMapper;
+
+
+    @Override
+    public HttpRespMsg changeProdProcedure(HttpServletRequest request, List<ProdProcedure> prodProcedureList, Integer productId,String version) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+
+        prodProcedureList.stream().forEach(prodProcedure -> {
+            user.getCompanyId();
+            prodProcedure.setCompanyId(user.getCompanyId());
+            prodProcedure.setProductId(productId);
+            prodProcedure.setVersionNumber(version);
+
+        });
+
+
+        //1.获取原有的工序id
+        List<ProdProcedure> oldList = prodProcedureMapper.selectList(new LambdaQueryWrapper<ProdProcedure>()
+                .eq(user.getCompanyId() != null, ProdProcedure::getCompanyId, user.getCompanyId())
+                .eq(productId != null, ProdProcedure::getProductId, productId)
+                .eq(StringUtils.isNotBlank(version),ProdProcedure::getVersionNumber,version)
+                .select(ProdProcedure::getId)
+        );
+
+        if(oldList!=null&&oldList.size()>0){
+
+            //2.要删除的id
+            List<ProdProcedure> deleteList = oldList.stream().filter(old -> {
+                for (ProdProcedure prodProcedure : prodProcedureList) {
+                    if (prodProcedure.getId() == old.getId()) {
+                        return false;
+                    }
+                }
+                return true;
+
+            }).collect(Collectors.toList());
+            if (deleteList != null && deleteList.size() > 0) {
+
+                List<Integer> deleteIdList = deleteList.stream().map(delete -> delete.getId()).collect(Collectors.toList());
+                prodProcedureMapper.deleteBatchIds(deleteIdList);
+            }
+
+            //3.编辑的id
+            List<ProdProcedure> updateList = prodProcedureList.stream().filter(prodProcedure -> prodProcedure.getId() != null).collect(Collectors.toList());
+            if (updateList != null&&updateList.size()>0) {
+                this.updateBatchById(updateList);
+            }
+            //4.新增的id
+            List<ProdProcedure> insertList = prodProcedureList.stream().filter(prodProcedure -> prodProcedure.getId() == null).collect(Collectors.toList());
+            if (insertList != null&&insertList.size()>0) {
+                this.saveBatch(insertList);
+            }
+        }else{
+
+            this.saveBatch(prodProcedureList);
+        }
+
+
+
+
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg isDelete(HttpServletRequest request, Integer deleteId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        //TODO: 检查工序是否已经被使用,被使用的不能删除
+        boolean flag=true;
+        msg.setData(flag);
+        return msg;
+    }
+
+    @Override
+    public HttpRespMsg getVersion(HttpServletRequest request, Integer productId) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+
+        List<ProdProcedure> procedureVersions = prodProcedureMapper.selectList(
+                new QueryWrapper<ProdProcedure>()
+                        .select("DISTINCT version_number")
+                        .lambda()
+                        .eq(productId != null, ProdProcedure::getProductId, productId)
+                        .eq(user.getCompanyId()!=null,ProdProcedure::getCompanyId,user.getCompanyId())
+
+        );
+        List<String> versionList = procedureVersions.stream().map(prodProcedure -> prodProcedure.getVersionNumber()).collect(Collectors.toList());
+        System.out.println(versionList);
+        System.out.println(procedureVersions);
+        httpRespMsg.data=versionList;
+        return httpRespMsg;
+    }
+
+    @Override
+    public HttpRespMsg getInfo(HttpServletRequest request, String version, Integer productId) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        User user = userMapper.selectById(token);
+        List<ProdProcedure> prodProcedureList = prodProcedureMapper.selectList(
+                new LambdaQueryWrapper<ProdProcedure>()
+                        .eq(user.getCompanyId() != null, ProdProcedure::getCompanyId, user.getCompanyId())
+                        .eq(StringUtils.isNotBlank(version), ProdProcedure::getVersionNumber, version)
+                        .eq(productId != null, ProdProcedure::getProductId, productId)
+
+        );
+        httpRespMsg.data=prodProcedureList;
+        return httpRespMsg;
+    }
 }

+ 42 - 4
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java

@@ -1,13 +1,16 @@
 package com.management.platform.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.management.platform.entity.Product;
-import com.management.platform.entity.Project;
-import com.management.platform.entity.User;
+import com.management.platform.entity.*;
+import com.management.platform.mapper.ProdMaterialMapper;
+import com.management.platform.mapper.ProdProcedureMapper;
 import com.management.platform.mapper.ProductMapper;
 import com.management.platform.mapper.UserMapper;
+import com.management.platform.service.ProdMaterialService;
+import com.management.platform.service.ProdProcedureService;
 import com.management.platform.service.ProductService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.util.HttpRespMsg;
@@ -17,6 +20,7 @@ import org.springframework.util.StringUtils;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -33,7 +37,14 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
     ProductMapper productMapper;
     @Resource
     UserMapper userMapper;
-
+    @Resource
+    ProdProcedureMapper prodProcedureMapper;
+    @Resource
+    ProdProcedureService prodProcedureService;
+    @Resource
+    ProdMaterialMapper prodMaterialMapper;
+    @Resource
+    ProdMaterialService prodMaterialService;
 
     @Override
     public HttpRespMsg getProductPage(Integer cateId, Integer pageIndex, Integer pageSize, String name, String code, HttpServletRequest request) {
@@ -76,7 +87,34 @@ public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> impl
             productMapper.updateById(product);
         }
         HttpRespMsg msg = new HttpRespMsg();
+        System.out.println(product);
         msg.setData(product);
         return msg;
     }
+
+    /**
+     * todo
+     * @param request
+     * @param id
+     * @return
+     */
+    @Override
+    public HttpRespMsg getProductInfo(HttpServletRequest request, Integer id) {
+        HttpRespMsg msg=new HttpRespMsg();
+       /* List<ProdProcedure> procedureVersions = (List<ProdProcedure>) prodProcedureService.getVersion(request,id).getData();
+
+        List<ProdMaterial> prodMaterialVersions = (List<ProdMaterial>) prodMaterialService.getVersion(request,id).getData();
+
+
+
+        ProdProcedure prodProcedure= (ProdProcedure) prodProcedureService.getInfo(request,procedureVersions.get(procedureVersions.size()-1).getVersionNumber(),id).getData();
+        ProdMaterial prodMaterial= (ProdMaterial) prodMaterialService.getInfo(request,prodMaterialVersions.get(prodMaterialVersions.size()-1).getVersionNumber(),id).getData();
+
+        Map<String,Object> map=new HashMap<>();
+        map.put("procedureVersions",procedureVersions);
+        map.put("prodMaterialVersions", prodMaterialVersions);
+        map.put("prodProcedure",prodProcedure);
+        map.put("")*/
+        return null;
+    }
 }

+ 0 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -37,7 +37,6 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.client.DefaultResponseErrorHandler;
 import org.springframework.web.client.RestTemplate;
 import org.springframework.web.multipart.MultipartFile;
-import sun.net.www.http.HttpClient;
 
 import javax.annotation.Resource;
 import javax.net.ssl.TrustManager;

+ 2 - 2
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/TaskProgressServiceImpl.java

@@ -12,12 +12,12 @@ import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.ListUtil;
 import com.management.platform.util.MessageUtils;
-import jdk.nashorn.internal.ir.IfNode;
+
 import org.apache.poi.ss.usermodel.Header;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
-import sun.misc.Request;
+
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;

+ 0 - 1
fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/util/MD5Util.java

@@ -1,7 +1,6 @@
 package com.management.platform.util;
 
 import org.springframework.util.DigestUtils;
-import sun.security.rsa.RSASignature;
 
 import java.security.MessageDigest;
 import java.text.ParseException;

+ 16 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/PlanDeptMapper.xml

@@ -0,0 +1,16 @@
+<?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.management.platform.mapper.PlanDeptMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.PlanDept">
+        <result column="company_id" property="companyId" />
+        <result column="dept_id" property="deptId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        company_id, dept_id
+    </sql>
+
+</mapper>

+ 38 - 0
fhKeeper/formulahousekeeper/management-workshop/src/main/resources/mapper/PlanMapper.xml

@@ -0,0 +1,38 @@
+<?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.management.platform.mapper.PlanMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.management.platform.entity.Plan">
+        <id column="id" property="id" />
+        <result column="product_scheduling_num" property="productSchedulingNum" />
+        <result column="product_id" property="productId" />
+        <result column="product_name" property="productName" />
+        <result column="project_code" property="projectCode" />
+        <result column="company_id" property="companyId" />
+        <result column="steel_stamp_number_start" property="steelStampNumberStart" />
+        <result column="steel_stamp_number_end" property="steelStampNumberEnd" />
+        <result column="num" property="num" />
+        <result column="main_process" property="mainProcess" />
+        <result column="station_id" property="stationId" />
+        <result column="station_name" property="stationName" />
+        <result column="foreman_id" property="foremanId" />
+        <result column="foreman_name" property="foremanName" />
+        <result column="plan_type" property="planType" />
+        <result column="plan_date" property="planDate" />
+        <result column="start_date" property="startDate" />
+        <result column="end_date" property="endDate" />
+        <result column="task_name" property="taskName" />
+        <result column="task_type_id" property="taskTypeId" />
+        <result column="task_change_notice_num" property="taskChangeNoticeNum" />
+        <result column="plan_work_hour" property="planWorkHour" />
+        <result column="money_of_job" property="moneyOfJob" />
+        <result column="describtion" property="describtion" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, product_scheduling_num, product_id, product_name, project_code, company_id, steel_stamp_number_start, steel_stamp_number_end, num, main_process, station_id, station_name, foreman_id, foreman_name, plan_type, plan_date, start_date, end_date, task_name, task_type_id, task_change_notice_num, plan_work_hour, money_of_job, describtion
+    </sql>
+
+</mapper>

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 42 - 161
fhKeeper/formulahousekeeper/timesheet-workshop/package-lock.json


+ 8 - 3
fhKeeper/formulahousekeeper/timesheet-workshop/src/routes.js

@@ -15,6 +15,11 @@ import cost from './views/project/cost.vue'
 import proDetail from './views/project/detail.vue'
 import depDetail from './views/project/detailDep.vue'
 
+//排产计划
+import todayPlan from './views/plan/today.vue'
+import tomorrowPlan from './views/plan/tomorrow.vue'
+import orderInsertPlan from './views/plan/orderInsert.vue'
+
 // 团队管理
 import team from './views/team/index.vue'
 
@@ -103,9 +108,9 @@ export const allRouters = [
         iconCls: 'iconfont firerock-iconxiangmu',
         leaf: false,
         children: [
-            { path: '/plan/today', component: prodList, name: '今日计划' },
-            { path: '/plan/tomorrow', component: prodList, name: '明日计划'},
-            { path: '/plan/orderInsert', component: prodList, name: '插单计划' },
+            { path: '/plan/today', component: todayPlan, name: '今日计划' },
+            { path: '/plan/tomorrow', component: tomorrowPlan, name: '明日计划'},
+            { path: '/plan/orderInsert', component: orderInsertPlan, name: '插单计划' },
         ],
     },
     

+ 23 - 0
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/orderInsert.vue

@@ -0,0 +1,23 @@
+<template>
+<div class='layout-container'>
+
+</div>
+</template>
+
+<script>
+export default {
+name: '',
+components: {},
+props: { },
+data() { 
+return {}
+},
+computed: {},
+watch: {},
+created () {},
+mounted () {},
+methods: {},
+}
+</script>
+<style scoped lang='scss'>
+</style>

+ 576 - 0
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/today.vue

@@ -0,0 +1,576 @@
+<template>
+  <div class="layout-container">
+    <div class="OutSide">
+        <div>今日计划</div>
+        <div>{{today()}}</div>
+        <div class="block">
+        <span class="demonstration">查询以往今日计划</span>
+        <el-date-picker
+        v-model="planDate"
+        type="date"
+        value-format="yyyy-MM-dd"
+        @change="getTableData(hasChooseDept)"
+        placeholder="选择日期">
+        </el-date-picker>
+        </div>
+        <div class="OutSide">
+            <span style="width:100px">{{'钢印号'}}</span><el-input v-model="steelStampNumber" @change="getTableData(hasChooseDept)" placeholder="请输入内容"></el-input>
+        </div>
+        <div>
+            <span>
+                <el-link type="primary" :underline="false" @click="deptSetDialog=true,getPlanDeptSet()">{{'部门设置'}}</el-link>
+                <el-link type="primary" :underline="false" @click="addPlan()">{{'新增今日计划'}}</el-link>
+                <el-link type="primary" :underline="false">{{'导入'}}</el-link>
+                <el-link type="primary" :underline="false">{{'导出'}}</el-link>
+            </span>
+        </div>
+    </div>
+    <!-- tab 切换 -->
+    <div class="today-tab">
+      <div v-for="item,index in hasSetDeptList" :key="index" :class="`${todayTabIndex === index ? 'on' : ''}`" @click="tabChange(item, index)">{{ item.departmentName }}</div>
+    </div>
+
+    <!-- 各部分数据列表 -->
+    <el-table
+      :data="tableData"
+      style="width: 100%"
+      v-loading="tableDataLoading">
+       <el-table-column
+        type="selection"
+        width="55">
+      </el-table-column>
+      <el-table-column
+        prop="productSchedulingNum"
+        label="排产工单号"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="productName"
+        label="产品名称"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="projectCode"
+        label="项目代码"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="num"
+        label="数量"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="mainProcess"
+        label="主工序"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="stationName"
+        label="工位名称"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="foremanId"
+        label="工长"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="startDate"
+        label="开工时间"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="endDate"
+        label="完工时间"
+        width="180">
+      </el-table-column>
+      <el-table-column label="编辑">
+        <template slot-scope="scope">
+          <div @click="editPlan(scope.row)">编辑</div>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 新增今日计划 -->
+    <el-dialog
+      title="新增今日计划"
+      :visible.sync="editPlanDiaLog"
+      width="800px"
+      top="18.5vh"
+      :before-close="handleClose">
+        <div class="planDialog">
+          <el-form ref="todayPlanForm" :rules="todayPlanFormrules" :model="todayPlanForm" label-width="120px">
+            <el-form-item label="排产工单号" style="width: 100%" prop="productSchedulingNum">
+              <el-input v-model="todayPlanForm.productSchedulingNum"></el-input>
+            </el-form-item>
+            <el-form-item label="产品名称" style="width: 100%"  prop="productId">
+              <el-select v-model="todayPlanForm.productId" placeholder="请选择" class="w100">
+                <el-option
+                  v-for="item in productList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="项目代码" style="width: 100%" prop="projectCode">
+              <el-input v-model="todayPlanForm.projectCode"></el-input>
+            </el-form-item>
+            <el-form-item label="钢印号" style="width: 100%" prop="steelStampNumberStart">
+              <el-input class="w45" v-model="todayPlanForm.steelStampNumberStart"></el-input>
+              {{'-'}}
+               <el-input class="w45" v-model="todayPlanForm.steelStampNumberEnd"></el-input>
+            </el-form-item>
+            <el-form-item label="数量"  prop="num">
+              <el-input v-model="todayPlanForm.num"></el-input>
+            </el-form-item>
+            <el-form-item label="主工序"  prop="mainProcess">
+              <el-input v-model="todayPlanForm.mainProcess"></el-input>
+            </el-form-item>
+            <el-form-item label="工位"  prop="stationId">
+              <!-- <el-select v-model="todayPlanForm.stationId" placeholder="请选择" class="w100" @change="getIncharger()">
+                <el-option
+                  v-for="item in departmentList"
+                  :key="item.id"
+                  :label="item.label"
+                  :value="item.id"
+                >
+                </el-option>
+              </el-select> -->
+               <el-cascader
+                v-model="todayPlanForm.stationId"
+                :options="departmentList"
+                :props="{ checkStrictly: true }"
+                collapse-tags
+                class="w100"
+                clearable
+                @change="getIncharger()">
+                </el-cascader>
+            </el-form-item>
+            <el-form-item label="工长" prop="foremanId">
+              <el-input v-model="todayPlanForm.foremanName"></el-input>
+            </el-form-item>
+            <el-form-item label="开工时间" prop="startDate">
+              <el-date-picker
+                class="w100"
+                v-model="todayPlanForm.startDate"
+                type="date"
+                placeholder="选择日期"
+                value-format="yyyy-MM-dd">
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item label="完工时间" prop="endDate">
+              <el-date-picker
+                class="w100"
+                v-model="todayPlanForm.endDate"
+                type="date"
+                placeholder="选择日期"
+                value-format="yyyy-MM-dd">
+              </el-date-picker>
+            </el-form-item>
+             <el-form-item label="描述" style="width: 100%">
+              <el-input
+                type="textarea"
+                :rows="6"
+                placeholder="请输入描述"
+                v-model="textarea">
+              </el-input>
+             </el-form-item>
+          </el-form>
+        </div>
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="editPlanDiaLog = false,$refs['todayPlanForm'].resetFields();">取 消</el-button>
+          <el-button type="primary" @click="addPlanData('todayPlanForm')">确 定</el-button>
+        </span>
+     </el-dialog>
+
+    <!-- 部门设置弹框 -->
+    <el-dialog
+      title="部门设置"
+      :visible.sync="deptSetDialog"
+      width="30%"
+      :before-close="handleClose">
+      <div>
+        <span>{{'选择部门'}}</span>
+        <el-cascader
+        v-model="departmentIdArray"
+        :options="departmentList"
+        :props="props"
+        collapse-tags
+        clearable>
+        </el-cascader>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="deptSetDialog = false">取 消</el-button>
+        <el-button type="primary" @click="deptSet()">确 定</el-button>
+      </span>
+  </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "",
+  components: {
+    
+  },
+  props: {
+
+  },
+  data() {
+    return {
+        steelStampNumber:'',
+        planDate:this.today(),
+        deptSetDialog:false,
+        departmentList:[],
+        departmentIdArray: [],
+        deptSetData:'',
+        props: { multiple: true },
+        hasSetDeptList:[],
+        todayPlanForm:{
+          productSchedulingNum:'',
+          productId:'',
+          projectCode:'',
+          steelStampNumberStart:'',
+          steelStampNumberEnd:'',
+          num:'',
+          mainProcess:'',
+          stationId:'',
+          foremanId:'',
+          foremanName:'',
+          startDate:'',
+          endDate:'',
+          describtion:''
+        },
+        todayTabIndex: 0,
+        tableDataLoading: false,
+        editPlanDiaLog: false,
+        pageIndex:0,
+        pageSize:20,
+        hasChooseDept:'',
+        productList:[],
+        // 表单规则验证
+        todayPlanFormrules: {
+          productSchedulingNum: [
+            { required: true, message: '排产工单号', trigger: 'blur' }
+          ],
+          productId: [
+            { required: true, message: '产品名称', trigger: 'blur' }
+          ],
+          projectCode: [
+            { required: true, message: '项目代码', trigger: 'blur' }
+          ],
+          steelStampNumberStart: [
+            { required: true, message: '钢印号', trigger: 'blur' }
+          ],
+          steelStampNumberEnd: [
+            { required: true, message: '钢印号', trigger: 'blur' }
+          ],
+          num: [
+            { required: true, message: '数量', trigger: 'blur' }
+          ],
+          mainProcess: [
+            { required: true, message: '主工序', trigger: 'blur' }
+          ],
+          stationId: [
+            { required: true, message: '工位', trigger: 'blur' }
+          ],
+          startDate: [
+            { required: true, message: '开工时间', trigger: 'blur' }
+          ],
+          endDate: [
+            { required: true, message: '完工时间', trigger: 'blur' }
+          ],
+        }
+    };
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {
+    this.getDepartmentList(),
+    this.getPlanDeptSet(),
+    this.getHasSetPlanDeptList(),
+    this.getProductList()
+  },
+  methods: {
+    today(){
+        let date=new Date();
+        let year=date.getFullYear();
+        let month=(date.getMonth()+1+'').padStart(2,'0');
+        let day=(date.getDate()+'').padStart(2,'0');
+        return `${year}-${month}-${day}`
+    },
+    getDepartmentList() {
+      this.http.post( this.port.manage.depList, {},
+        res => {
+          if (res.code == "ok") {
+            let dptlist = JSON.parse(JSON.stringify(res.data));
+            this.departmentList = this.changeArr(dptlist);
+          } else {
+            this.$message({
+              message: res.msg,
+              type: "error"
+            });
+          }
+        },error => {
+          this.$message({
+            message: error,
+            type: "error"
+          });
+        });
+    },
+    changeArr(arr) {
+        for (var i = 0; i < arr.length; i++) {
+            if(arr[i].id != -1 && arr[i].id != 0) {
+                if (arr[i].children != null && arr[i].children.length>0) {
+                    arr[i].children = this.changeArr(arr[i].children);
+                }
+                arr[i].id && (arr[i].value = arr[i].id);
+                delete arr[i].id;
+            }
+        }
+        for(var i in arr) {
+            if(arr[i].id == -1 || arr[i].id == 0) {
+                arr.splice(i,1)
+            }    
+        }
+        return arr;
+    },
+    deptSet(){
+      console.log(this.departmentIdArray, JSON.stringify(this.departmentIdArray))
+      // return
+      let arr = []
+      for(var i in this.departmentIdArray) {
+        arr.push(this.departmentIdArray[i][this.departmentIdArray[i].length - 1])
+      }
+      this.http.post( '/plan/deptSet', {deptIds:arr.join(',')},
+        res => {
+          if (res.code == "ok") {
+            this.$message({
+              message: "设置成功",
+              type: "success"
+            });
+          } else {
+            this.$message({
+              message: res.msg,
+              type: "error"
+            });
+          }
+        },error => {
+          this.$message({
+            message: error,
+            type: "error"
+          });
+        });
+    },
+    getPlanDeptSet(){
+      this.http.post( '/plan/deptList', {},
+        res => {
+          if (res.code == "ok") {
+            let arr = res.data.split(",") || []
+            for(var i in arr) {
+              arr[i] = +arr[i]
+            }
+            console.log(arr)
+            this.departmentIdArray=arr 
+          } else {
+            this.$message({
+              message: res.msg,
+              type: "error"
+            });
+          }
+        },error => {
+          this.$message({
+            message: error,
+            type: "error"
+          });
+        });
+    },
+    getHasSetPlanDeptList(){
+      this.http.post( '/plan/hasSetDeptDetail', {},
+        res => {
+          if (res.code == "ok") {
+            this.hasSetDeptList=res.data
+            if(res.data.length > 0) {
+              this.tableDataLoading = true
+              this.hasChooseDept=res.data[0].departmentId
+              this.getTableData(res.data[0].departmentId)
+            }
+          } else {
+            this.$message({
+              message: res.msg,
+              type: "error"
+            });
+          }
+        },error => {
+          this.$message({
+            message: error,
+            type: "error"
+          });
+        });
+    },
+
+    // tab 切换事件
+    tabChange(item, index) {
+      console.log(item, 'item')
+      this.todayTabIndex = index
+      this.tableDataLoading = true
+      this.hasChooseDept=item.departmentId
+      this.getTableData(item.departmentId)
+    },
+    // 获取车间数据
+    getTableData(departmentId) {
+      console.log(this.planDate)
+      this.http.post( '/plan/list', {
+        deptId: departmentId,
+        planType: 0,
+        date: this.planDate,
+        steelStampNumber:this.steelStampNumber,
+        pageIndex:this.pageIndex,
+        pageSize:this.pageSize
+      },
+        res => {
+          if (res.code == "ok") {
+            this.tableDataLoading = false
+          } else {
+            this.$message({
+              message: res.msg,
+              type: "error"
+            });
+          }
+        },error => {
+          this.$message({
+            message: error,
+            type: "error"
+          });
+        });
+    },
+    addPlan() {
+      this.editPlanDiaLog = true
+      this.getDepartmentList()
+      this.getProductList()
+      // this.todayPlanForm
+    },
+    addPlanData(formName) {
+      console.log(this.todayPlanForm)
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+              console.log(this.todayPlanForm, '传给后端的值')
+              let stationId = this.todayPlanForm.stationId[this.todayPlanForm.stationId.length - 1]
+              this.http.post( '/plan/addOrUpdatePlan', {},
+            res => {
+              if (res.code == "ok") {
+
+              } else {
+                this.$message({
+                  message: res.msg,
+                  type: "error"
+                });
+              }
+            },error => {
+              this.$message({
+                message: error,
+                type: "error"
+              });
+            });
+        } else {
+          console.log('error submit!!');
+          return false;
+        }
+      });
+    },
+    editPlan(item) {
+      console.log(item)
+    },
+    getProductList(){
+      this.http.post( '/product/getProductPage', {
+        pageIndex:null,
+        pageSize:null
+      },
+        res => {
+          if (res.code == "ok") {
+            this.productList=res.data.records
+          } else {
+            this.$message({
+              message: res.msg,
+              type: "error"
+            });
+          }
+        },error => {
+          this.$message({
+            message: error,
+            type: "error"
+          });
+        });
+    },
+    getIncharger(){
+      console.log(this.todayPlanForm.stationId)
+      this.http.post( '/department/getIncharger', {
+        deptId:this.todayPlanForm.stationId[this.todayPlanForm.stationId.length - 1]
+      },
+        res => {
+          if (res.code == "ok") {
+            this.todayPlanForm.foremanId=res.data.id
+            this.todayPlanForm.foremanName=res.data.name
+          } else {
+            this.$message({
+              message: res.msg,
+              type: "error"
+            });
+          }
+        },error => {
+          this.$message({
+            message: error,
+            type: "error"
+          });
+        });
+    }
+  },
+};
+</script>
+<style scoped lang='scss'>
+ .layout-container{
+    .OutSide{
+        display: flex;
+        align-items: center;
+    }
+    .today-tab {
+      display: flex;
+      overflow-x: auto;
+      div {
+        font-size: 18px;
+        margin-left: 15px;
+        cursor: pointer;
+      }
+      .on {
+        color: #02A7F0;
+      }
+    }
+
+    .planDialog::-webkit-scrollbar {
+      display: none; /* Chrome Safari */
+    }
+    // 新增样式
+    .planDialog {
+      max-height: 50vh;
+      overflow-y: auto;
+      scrollbar-width: none; /* Firefox */
+      -ms-overflow-style: none; /* IE 10+ */
+      .el-form {
+        display: flex;
+        flex-wrap: wrap;
+        justify-content: space-between;
+      }
+      .w100 {
+        width: 100%;
+      }
+      .el-form-item {
+        width: 50%;
+        .w45 {
+          width: 49%;
+        }
+      }
+    }
+ }
+</style>

+ 21 - 0
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/plan/tomorrow.vue

@@ -0,0 +1,21 @@
+<template>
+  <div class="layout-container"></div>
+</template>
+
+<script>
+export default {
+  name: "",
+  components: {},
+  props: {},
+  data() {
+    return {};
+  },
+  computed: {},
+  watch: {},
+  created() {},
+  mounted() {},
+  methods: {},
+};
+</script>
+<style scoped lang='sass'>
+</style>

+ 611 - 56
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/product/list.vue

@@ -27,15 +27,123 @@
                     <el-link type="primary" :underline="false" @click="handleAdd(-1,null)">新增产品</el-link>
                 </el-form-item>
                 <el-form-item style="float:right;" >
-                        <el-link type="primary" :underline="false" @click="isganttshow = true">分类管理</el-link>
+                        <el-link type="primary" :underline="false" @click="getCategoryList()">分类管理</el-link>
                 </el-form-item>
             </el-form>
         </el-col>
         <!--列表-->
-        <el-table ref="productTbl" v-if="showTable" @cell-mouse-enter="hoverCall" @cell-mouse-leave="handCall" :cell-class-name="tableCellClassName"  :default-expand-all="defaultExpandAllFlg" :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;" @sort-change="tableSort">
-            <el-table-column type="expand" :label="''">
-                
+        <el-table ref="productTbl" v-if="showTable" @cell-mouse-enter="hoverCall" @cell-mouse-leave="handCall" :cell-class-name="tableCellClassName"  :default-expand-all="defaultExpandAllFlg" :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;" @sort-change="tableSort" @expand-change="expandChange"  >
+            
+            <el-table-column type="expand">
+                <template slot-scope="props">
+                    <el-form label-position="left" inline class="demo-table-expand">
+                        <el-form-item label="派工单">
+                            <span>版本号:</span>
+                            <el-select v-model="procedureVersion" placeholder="请选择版本号" @change="changeProcedureVersion(props.row)">
+                                 <el-option
+                                    v-for="item in props.row.tableProdProcedure.versions"
+                                    :key="item"
+                                    :label="item"
+                                    :value="item"
+                                    >
+                                </el-option>
+                            </el-select>
+                        </el-form-item>
+                        <el-form-item >
+                          <el-table
+                              :data="props.row.tableProdProcedure.procedureList"
+                               border
+                                style="width: 100%">
+                               <el-table-column
+                                prop="name"
+                                label="工序名称"
+                                width="180">
+                                </el-table-column>
+                                <el-table-column
+                                prop="unitPrice"
+                                label="单件工时"
+                                 width="180">
+                                </el-table-column>
+                                <el-table-column
+                                 prop="workingTime"
+                                label="单件工价"
+                                width="180">
+                                </el-table-column>
+                                <el-table-column
+                                label="质检类型"
+                                width="180">
+                                    <template slot-scope="scope">
+                                        <span v-if="scope.row.checkType == 0">自检</span>
+                                        <span v-if="scope.row.checkType==1">互检</span>
+                                        <span v-if="scope.row.checkType == 2">专检</span>     
+                                    </template>
+                                <!--   -->
+                                </el-table-column>
+                          </el-table>                    
+                            
+                        </el-form-item>
+                        
+                         <el-form-item label="物料单">
+                                <span>版本号:</span>
+                                <el-select v-model="prodMaterialVersion" placeholder="请选择版本号" @change="changeMaterialVersion(props.row)">
+                                     <el-option
+                                        v-for="item in props.row.tableProdMaterial.versions"
+                                        :key="item"
+                                        :label="item"
+                                        :value="item"
+                                        >
+                                    </el-option>
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item >
+                              <el-table
+                                  :data="props.row.tableProdMaterial.materialList"
+                                   border
+                                    style="width: 100%">
+                                   <el-table-column
+                                     prop="name"
+                                    label="零件名称"
+                                    width="180">
+                                    </el-table-column>
+                                    <el-table-column
+                                    prop="companyCode"
+                                    label="公司编码"
+                                    width="180">
+                                    </el-table-column>
+                                    <el-table-column
+                                      prop="companyDrawingNo"
+                                    label="公司图号"
+                                    width="180">
+                                    </el-table-column>
+                                    <el-table-column
+                                    prop="materialQuality"
+                                    label="材质"
+                                    width="180">
+                                 </el-table-column>
+                                 <el-table-column
+                                        prop="thickness"
+                                        label="厚度"
+                                        width="180">
+                                  </el-table-column>
+                                  <el-table-column
+                                        prop="numberProduct"
+                                        label="数量(个/产品)"
+                                        width="180">
+                                        </el-table-column>
+                                        <el-table-column
+                                        prop="numberVehicle"
+                                        label="数量(个/辆)"
+                                        width="180">
+                                    </el-table-column>
+                              </el-table>                    
+                            
+                            </el-form-item>
+                    </el-form>
+                </template>
             </el-table-column>
+
+
+
             <el-table-column prop="name" label="产品名称" sortable="custom" width="300"></el-table-column>
             <el-table-column prop="code" label="项目代码" width="200" ></el-table-column>
             <el-table-column prop="orderNumber" label="订单数量" width="100" ></el-table-column>
@@ -51,7 +159,7 @@
         </el-table>
 
         <!--工具条-->
-        <el-col :span="24" class="toolbar">
+        <el-col :span="24" class="toolbar" v-if="false">
                 <el-button size="small" @click="batchSetWudulistBtn1" v-if="(user.timeType.customDegreeActive || user.company.packageProject) && (showColumnWidth != '0' || permissions.projectManagement)">{{ $t('btn.cancel') }}</el-button>
             <template v-if="user.timeType.customDegreeActive && (showColumnWidth != '0' || permissions.projectManagement)">
                 <el-button size="small" type="primary" @click="batchSetWudulistBtn2(true)">{{ $t('volumeset') }} {{user.timeType.customDegreeName}}</el-button>
@@ -122,61 +230,124 @@
                 </div>
                 <div v-if="prodEditActive == 1" >
                     <!--此处是录入工序的模块-->
-                    <el-input placeholder="请输入工序版本号"></el-input>
-                    <el-table :data="projectProfessionList" size="small" :key="Math.random()" :height="'400px'">
-                        <el-table-column prop="professionId" width="200">
-                            <template slot-scope="scope">
-                                <el-select v-model="scope.row.professionId" >
-                                    <el-option v-for="item in professionList" :key="item.id" :label="item.name" :value="item.id"/>
-                                </el-select>
-                            </template>
-                            <template slot="header" >
-                                <span style="font-size:14px;font-weight:normal;">{{ $t('nameprofessional') }}</span>
-                            </template>
-                        </el-table-column>
-                        <el-table-column prop="percentage" width="120" :label="$t('zhan-bi')">
-                            <template slot-scope="scope">
-                                <div><el-input type="number" v-model="scope.row.percentage"></el-input></div>
-                            </template>
-                        </el-table-column>
-                        
-                        <el-table-column prop="membNames" :label="$t('personnelproportion')">
-                            <template slot-scope="scope">
-                                <span style="margin:0 5px;" v-for="item in scope.row.membList" :key="item.membId">
-                                        <span v-if="user.userNameNeedTranslate != 1">{{item.membName}}({{item.percentage}}%)</span>
-                                        <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.membName'></ww-open-data>({{item.percentage}}%)</span>
-                                    </span>
-                                <el-link @click="showEditPpMembs(scope.row)">{{(scope.row.membList == null || scope.row.membList.length == 0)?$t('professionalparticipants'):$t('setup')}}</el-link>
-                            </template>
-                        </el-table-column>
-                        <el-table-column prop="inchargerName" width="200" :label="$t('head')">
-                            <template slot-scope="scope">
-                                <el-select v-model="scope.row.inchargerId" v-if="user.userNameNeedTranslate != 1">
-                                    <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
-                                </el-select>
-
-                                <selectCat v-if="user.userNameNeedTranslate == 1" :size="'mini'" :subject="participator" :subjectId="scope.row.inchargerId" :other="scope.$index" :distinction="'4'" @selectCal="selectCal"></selectCat>
-
-                            </template>
-                        </el-table-column>
-                        <el-table-column  width="80">
-                            <template slot-scope="scope">
-                                <el-button icon="el-icon-delete" size="mini" style="margin-left:10px;" @click.stop.native="deleteItem(scope.$index)"></el-button>
-                            </template>
-                            <template slot="header" >
-                                <el-link type="primary" :underline="false" @click="addItem">{{ $t('addTian') }}</el-link>
-                            </template>
-                        </el-table-column>
-                    </el-table>
+                    <el-input placeholder="请输入工序版本号"  v-model="procedureVersion" class="input-pM"></el-input>
+                            <el-table :data="procedureLit"  style="width: 100%">
+                                 <el-table-column
+                                    prop="name"
+                                    label="工序名称"
+                                    width="180">
+                                    <template slot-scope="scope">
+                                        <el-input v-model="scope.row.name" placeholder="请输入"></el-input>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column
+                                    prop="unitPrice"
+                                    label="单件工时"
+                                    width="180">
+                                    <template slot-scope="scope">
+                                        <el-input v-model="scope.row.unitPrice" placeholder="请输入"></el-input>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column
+                                    prop="workingTime"
+                                    label="单件工价"
+                                    width="180">
+                                    <template slot-scope="scope">
+                                        <el-input v-model="scope.row.workingTime" placeholder="请输入"></el-input>
+                                    </template>
+                                </el-table-column>
+                                <el-table-column
+                                    label="质检类型"
+                                    width="180">
+                                    <template slot-scope="scope">
+                                        <el-select v-model="scope.row.checkType" placeholder="请选择">
+                                            <el-option
+                                            v-for="item in checkTypeOptions"
+                                            :key="item.value"
+                                            :label="item.label"
+                                            :value="item.value">
+                                            </el-option>
+                                        </el-select>
+                                       
+                                    </template>
+                                </el-table-column>
+                                 <el-table-column label="操作" width="100"  fixed="right" >
+                                    <template slot-scope="scope">
+                                        <el-button size="mini" @click="deleteProcedure(scope.$index, scope.row)">删除</el-button>
+                                    </template>
+                                </el-table-column>
+                            </el-table>
+                            <i class="el-icon-plus" @click="addProcedure()"></i>
+                    
                 </div>
                 <div v-if="prodEditActive == 2" >
                     <!--此处是录入物料的模块-->
-                    <el-input placeholder="请输入物料版本号"></el-input>
+                   
+                        <el-input placeholder="请输入物料版本号" v-model="prodMaterialVersion" class="input-pM"></el-input>
+                        <el-table :data="prodMaterialList"  style="width: 100%">
+                             <el-table-column
+                                prop="name"
+                                label="零件名称"
+                                width="180">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.name" placeholder="请输入"></el-input>
+                                </template>
+                            </el-table-column>
+                            <el-table-column
+                                prop="companyCode"
+                                label="公司编码"
+                                width="180">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.companyCode" placeholder="请输入"></el-input>
+                                </template>
+                            </el-table-column>
+                            <el-table-column
+                                prop="companyDrawingNo"
+                                label="公司图号">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.companyDrawingNo" placeholder="请输入"></el-input>
+                                </template>
+                            </el-table-column>
+                            <el-table-column
+                                prop="materialQuality"
+                                label="材质">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.materialQuality" placeholder="请输入"></el-input>
+                                </template>
+                            </el-table-column>
+                             <el-table-column
+                                prop="thickness"
+                                label="厚度">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.thickness" placeholder="请输入"></el-input>
+                                </template>
+                            </el-table-column>
+                             <el-table-column
+                                prop="numberProduct"
+                                label="数量(个/产品)">
+                                <template slot-scope="scope">
+                                    <el-input v-model="scope.row.numberProduct" placeholder="请输入"></el-input>
+                                </template>
+                            </el-table-column>
+                             <el-table-column
+                                    prop="numberVehicle"
+                                    label="数量(个/辆)">
+                                    <template slot-scope="scope">
+                                        <el-input v-model="scope.row.numberVehicle" placeholder="请输入"></el-input>
+                                    </template>
+                                </el-table-column>
+                             <el-table-column label="操作" width="100"  fixed="right" >
+                                <template slot-scope="scope">
+                                    <el-button size="mini" @click="deleteMaterial(scope.$index, scope.row)">删除</el-button>
+                                </template>
+                            </el-table-column>
+                        </el-table>
+                        <i class="el-icon-plus" @click="addMaterial()"></i>
                 </div>
                 
             <div slot="footer" class="dialog-footer;">
-                <el-button @click.native="deletePro(1, addForm)" v-if="addForm.id" style="float:left">{{ $t('btn.delete') }}</el-button>
-                <el-button @click.native="addFormVisible = false">{{ $t('btn.cancel') }}</el-button>
+                <!-- <el-button @click.native="deletePro(1, addForm)" v-if="addForm.id" style="float:left">{{ $t('btn.delete') }}</el-button> -->
+                <el-button @click.native="prodEditActive = 0;addFormVisible = false ">{{ $t('btn.cancel') }}</el-button>
                 <el-button v-if="prodEditActive == 0" type="primary" @click="submitInsert(0)" :loading="addLoading">保存</el-button>
                 <el-button v-if="prodEditActive == 0" type="primary" @click="submitInsert(1)" :loading="addLoading">保存并编辑工序</el-button>
                 <el-button v-if="prodEditActive == 1" type="primary" @click="submitSequence(0)" :loading="addLoading">保存工序</el-button>
@@ -208,6 +379,58 @@
                 <el-button type="primary" @click="userDetailVisible = false" >{{ $t('btn.determine') }}</el-button>
             </div>
         </el-dialog>
+
+
+        <!-- 产品分类管理 -->
+        <el-dialog
+            title="分类管理"
+            :visible.sync="isganttshow"
+            width="40%"
+            :before-close="handleClose">
+            <div>
+                <el-table
+                :data="categoryList"
+                style="width: 100%">
+                     <el-table-column
+                        type="index"
+                        width="180">
+                    </el-table-column>         
+                    <el-table-column
+                        prop="name"
+                        label="分类名称"
+                        width="180">
+                    </el-table-column>
+                    <el-table-column
+                        label="操作">
+                        <template slot-scope="scope">
+                            <el-button size="mini" @click="updateCategory(scope.row)">编辑</el-button>
+                            <el-button size="mini" @click="deleteCategory(scope.row)">删除</el-button>
+                         </template>
+                    </el-table-column>
+                </el-table>
+            </div>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="isganttshow = false">取 消</el-button>
+                <el-button type="primary" @click="isganttshowCa = true; title ='新增'">新增</el-button>
+            </span>
+        </el-dialog>
+         <el-dialog
+            :title="title"
+            :visible.sync="isganttshowCa"
+            width="30%"
+            >
+            <div>
+               <el-form ref="form" :model="category" label-width="80px">
+                     <el-form-item label="分类名称">
+                        <el-input v-model="category.name"></el-input>
+                    </el-form-item>
+               </el-form> 
+            </div>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="isganttshowCa = false">取 消</el-button>
+                <el-button type="primary" @click=" saveCategory()">确定</el-button>
+            </span>
+        </el-dialog>
         <!-- 子项目列表 -->
         <el-dialog :title="$t('listofsubitems')" show-header="false" v-if="subProjectVisible" :visible.sync="subProjectVisible" :close-on-click-modal="false" customClass="customWidth" width="500px">
             <el-table :data="subProjectList" highlight-current-row  height="400" style="width: 100%;">
@@ -399,6 +622,9 @@ a {
 .router-link-active {
   text-decoration: none;
 }
+.input-pM{
+    width: 50%;
+}
 </style>
 <script>
     import util from "../../common/js/util";
@@ -410,7 +636,30 @@ a {
         },
         data() {
             return {
+                categoryList: [],
+                category:{},
+                procedureVersion: "",
+                prodMaterialVersion: "",
+                //项目展开的详情
+                procedureVersions: [],  //产品的工序版本集合
+                prodMaterialVersions: [],  //产品的物料版本集合
+                procedureLit: [],//当前版本的工序集合
+                prodMaterialList: [],  //当前版本的物料集合
+                checkTypeOptions: [
+                    {
+                       value: 0,
+                        label: '自检'
+                    }, {
+                        value: 1,
+                        label: '互检'
+                    }, {
+                        value: 2,
+                        label: '专检'
+                    }
+                ],
+                
                 prodEditActive: 0,
+                productId: null,
                 cateName: null,
                 cateId: null,
                 name: null,
@@ -435,6 +684,7 @@ a {
                 showImportResult: false,
                 importResultMsg:null,
                 isganttshow: false,
+                isganttshowCa: false,
                 deleteAlertMsg: null,
                 chosenLeaders:[],
                 baseClfList:[],
@@ -492,7 +742,18 @@ a {
                 total: 0,
                 page: 1,
                 size: localStorage.getItem("projectPageSize")==null?20:parseInt(localStorage.getItem("projectPageSize")),
-                list: [],
+                list: [
+                    {
+                        tableProdProcedure:{
+                            versions: [],
+                            procedureList: []
+                        },
+                        tableProdMaterial: {
+                             versions: [],
+                             materialList: []
+                        }
+                    }
+                ],
                 subProjectVisible: false,
                 subProjectList: [],//子项目列表
                 currentProject:{},
@@ -658,6 +919,283 @@ a {
             })
         },
         methods: {
+            updateCategory(row){
+                this.isganttshowCa = true
+                this.title="编辑"
+                this.category=row
+            },
+            deleteCategory(row){
+                this.http.post("/prod-category/delete",{ id: row.id},
+                res=>{
+                    console.log("=======",res.code)
+                    if(res.code==='ok'){
+                        this.getCategoryList()
+                         this.$message({
+                            showClose: true,
+                            message: '删除成功',
+                            type: 'success'
+                        });
+                    }else{
+                         this.$message({
+                            showClose: true,
+                            message: '该分类正在使用中,不能删除',
+                            type: 'warning'
+                        });
+                    }
+                })
+             },
+            saveCategory(){
+                
+                this.http.post("/prod-category/saveOrUpdateInfo",this.category,
+                res=>{
+                    if(res.code=='ok'){
+                        this.isganttshowCa = false
+                        this.getCategoryList()
+                        this.category={}
+                    }
+                   
+
+                })
+
+            },
+
+            getCategoryList(){
+                this.isganttshow = true
+                console.log("======")
+                console.log(this.categoryList)
+                this.http.post("/prod-category/getList",null,
+               res => {
+                    this.categoryList=res.data
+                    console.log(this.categoryList)
+                })
+
+            },
+             handleClose(done) {
+                this.$confirm('确认关闭?')
+                    .then(_ => {
+                        done();
+                    })
+                    .catch(_ => { });
+            },
+            changeProcedureVersion(row){
+                let index = null
+                for (var i in this.list) {
+                    if (this.list[i].id === row.id) {
+                        index = i
+                        break
+                    }
+                }
+                this.getProdProcedureVersion(row.id,index)
+            },
+            changeMaterialVersion(row) {
+            let index = null
+            for (var i in this.list) {
+                if (this.list[i].id === row.id) {
+                    index = i
+                    break
+                }
+            }
+            this.getProdMaterialVersion(row.id, index)
+        },
+             // 获取row的key值
+            getRowKeys(row) {
+                return row.id;
+            },
+             // 展开事件----动态获取内嵌表数据(项目)
+        expandChange(row, expandedRows) {
+            // 该处是用于判断是展开还是收起行,只有展开的时候做请求,避免多次请求!
+            // 展开的时候expandedRows有值,收起的时候为空.
+            if (expandedRows.length > 0) {
+
+                 let index = null
+                for (var i in this.list) {
+                    if (this.list[i].id === row.id) {
+                        index = i
+                        break
+                    }
+                }
+                console.log(index, '索引')
+                this.http.post("/prod-procedure/getVersions", { productId: row.id },
+                    res => {
+                        this.list[index].tableProdProcedure.versions = res.data
+                        this.procedureVersion = res.data[res.data.length - 1]
+                        this.getProdProcedureVersion(row.id, index)
+                        
+                        
+                    })
+                this.http.post("/prod-material/getVersions", { productId: row.id },
+                    res => {
+                        this.list[index].tableProdMaterial.versions = res.data
+                        this.prodMaterialVersion = res.data[res.data.length - 1]
+                        this.getProdMaterialVersion(row.id, index)
+                      
+                    })
+            }
+        },
+            getProdProcedureVersion(id,index){
+                if(this.procedureVersion!=null&&this.procedureVersion!=''){
+                    this.http.post("/prod-procedure/getInfo", { version: this.procedureVersion, productId: id },
+                    res => {
+                        // this.list[index].tableProdProcedure.procedureList = res.data;
+                        // this.$forceUpdate();
+                        this.$set(this.list[index].tableProdProcedure, 'procedureList', res.data );
+                    })
+                }
+                
+            },
+             getProdMaterialVersion( id,index) {
+                if(this.prodMaterialVersion!=null&& this.prodMaterialVersion!=''){
+                    this.http.post("/prod-material/getInfo", { version: this.prodMaterialVersion, productId: id },
+                    res => {
+                       /*  this.list[index].tableProdMaterial.materialList = res.data;
+                        this.$forceUpdate(); */
+                        this.$set(this.list[index].tableProdMaterial, 'materialList', res.data);
+                    })
+                }
+                
+            },
+            submitSequence(addSequence){
+                this.addLoading = true;
+                let procedureString =JSON.stringify(this.procedureLit);
+            this.http.post('/prod-procedure/changeProdProcedure', {
+                productId: this.productId,
+                version: this.procedureVersion,
+                prodProcedures: procedureString
+            },
+                res => {
+                    this.addLoading = false;
+                    if (res.code == "ok") {
+                        this.$message({
+                            message: (this.addForm.id != null ? this.$t('xiu-gai') : this.$t('create')) + this.$t('other.successful'),
+                            type: "success"
+                        });
+                        if (addSequence) {
+                            //进入物料录入
+                           
+                            this.http.post('/prod-material/getProdMaterialList', { productId: this.productId },
+                                res => {
+                                    this.prodMaterialList = res.data.prodMaterialList;
+                                    this.prodMaterialVersion = res.data.version;
+                                })
+                            this.prodEditActive = 2;
+                            
+                            
+                        } else {
+                            this.addFormVisible = false;
+                        }
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.addLoading = false;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+              
+            },
+
+            //删除工序
+            deleteProcedure(index,row){
+                if(row.id!=null){
+                    this.http.get("/prod-procedure/isDelete",row.id,
+                    res=>{
+                        if(!res.data){
+                            this.procedureLit.splice(index, 1)
+                        }else{
+                            this.$message({
+                                message: '该工序已被使用,不能删除',
+                                type: 'warning'
+                            });
+                        }
+                    })
+                }else{
+                     this.procedureLit.splice(index, 1)
+                }
+                
+            },
+            // 向表格中添加数据
+            addProcedure() {
+                this.procedureLit = [...this.procedureLit, {
+                    name: '',
+                    unitPrice: '',
+                    workingTime: '',
+    
+                }]
+            },
+             // 向表格中添加数据
+            addMaterial() {
+                this.prodMaterialList = [...this.prodMaterialList, {
+                    name: '',
+                    companyCode: '',
+                    companyDrawingNo: '',
+                    materialQuality: '',
+                    thickness: '',
+                    numberProduct: '',
+                    numberVehicle: ''
+
+                }]
+            },
+            submitMaterial(){
+                    this.addLoading = true;
+                let materialString = JSON.stringify(this.prodMaterialList);
+                this.http.post('/prod-material/changeProdMaterial', {
+                    productId: this.productId,
+                    version: this.prodMaterialVersion,
+                    prodMaterials: materialString
+                },
+                res => {
+                    this.addLoading = false;
+                    if (res.code == "ok") {
+                        this.$message({
+                            message: (this.addForm.id != null ? this.$t('xiu-gai') : this.$t('create')) + this.$t('other.successful'),
+                            type: "success"
+                        });
+                       
+                        this.addFormVisible = false;
+                        this.prodEditActive  = 0
+                    } else {
+                        this.$message({
+                            message: res.msg,
+                            type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.addLoading = false;
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            },
+             //删除工物料
+            deleteMaterial(index, row) {
+                if (row.id != null) {
+                    console.log(index);
+                    this.http.get("/prod-material/isDelete", row.id,
+                        res => {
+                            if (!res.data) {
+                                this.prodMaterialList.splice(index,1);
+                            } else {
+                                this.$message({
+                                    message: '该物料已被使用,不能删除',
+                                    type: 'warning'
+                                });
+                            }
+                        })
+                }else{
+                    this.prodMaterialList.splice(index, 1)
+                }
+
+            },
+
+
             // 进入页面所执行的函数
             mountedEnter() {
                 this.cateId =  this.$route.params.cateId;
@@ -676,6 +1214,7 @@ a {
                 this.getUsers();
             },
 
+            
             defaultExpandAllFlgCli() {
                 this.defaultExpandAllFlg = !this.defaultExpandAllFlg
                 this.list = JSON.parse(JSON.stringify(this.list))
@@ -2234,6 +2773,7 @@ a {
                     pageSize: this.size,
                     name:this.name,
                     code: this.code,
+                    cateId : this.cateId
                 }
                 
                 this.http.post('/product/getProductPage', parameter,
@@ -2241,6 +2781,10 @@ a {
                     this.listLoading = false;
                     if (res.code == "ok") {
                         var list = res.data.records;
+                        for(var i in list) {
+                            list[i].tableProdProcedure = {}
+                            list[i].tableProdMaterial = {}
+                        }
                         this.list = list;
                         this.total = res.data.total;
                     } else {
@@ -2511,17 +3055,25 @@ a {
                 this.$refs.form1.validate(valid => {
                     if (valid) {
                         this.addLoading = true;
-                        
+                        this.addForm.categoryId =this.cateId;
                         this.http.post('/product/saveProductInfo',this.addForm,
                         res => {
                             this.addLoading = false;
                             if (res.code == "ok") {
+                                this.productId=res.data.id;
                                 this.$message({
                                     message: (this.addForm.id!=null?this.$t('xiu-gai'):this.$t('create'))+this.$t('other.successful'),
                                     type: "success"
                                 });
                                 if (addSequence) {
                                     //进入工序录入
+                                     this.http.post('/prod-procedure/getProdProcedureList',{productId: this.productId},
+                                        res=>{
+                                            this.procedureLit=res.data.prodProcedureList;
+                                            this.procedureVersion=res.data.version;
+                                    
+                                    })
+                            
                                     this.prodEditActive = 1;
                                 } else {
                                     this.addFormVisible = false;
@@ -2803,6 +3355,9 @@ a {
 </script>
 
 <style lang="scss" scoped>
+.demo-table-expand .el-form-item {
+    width: 100%;
+}
 .rg_span{
     display: inline-block;
 }