Sfoglia il codice sorgente

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

Min 1 anno fa
parent
commit
1e68d2a85e
22 ha cambiato i file con 1304 aggiunte e 280 eliminazioni
  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. 3 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/MaterialController.java
  4. 36 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProdCategoryController.java
  5. 75 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProdMaterialController.java
  6. 76 2
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProdProcedureController.java
  7. 11 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/controller/ProductController.java
  8. 53 7
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/ProdMaterial.java
  9. 28 13
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/entity/ProdProcedure.java
  10. 6 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProdCategoryService.java
  11. 12 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProdMaterialService.java
  12. 12 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProdProcedureService.java
  13. 2 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/ProductService.java
  14. 47 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProdCategoryServiceImpl.java
  15. 114 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProdMaterialServiceImpl.java
  16. 124 0
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProdProcedureServiceImpl.java
  17. 42 4
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ProductServiceImpl.java
  18. 0 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  19. 2 2
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/service/impl/TaskProgressServiceImpl.java
  20. 0 1
      fhKeeper/formulahousekeeper/management-workshop/src/main/java/com/management/platform/util/MD5Util.java
  21. 42 161
      fhKeeper/formulahousekeeper/timesheet-workshop/package-lock.json
  22. 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>

+ 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 {
 
+
 }
 

+ 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);
+    }
 }
 

+ 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;
     }
-
 }

+ 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);
 }

+ 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;

File diff suppressed because it is too large
+ 42 - 161
fhKeeper/formulahousekeeper/timesheet-workshop/package-lock.json


+ 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;
 }