wangxiaoming il y a 7 ans
Parent
commit
5d2cd5dc28
18 fichiers modifiés avec 1011 ajouts et 121 suppressions
  1. 50 0
      watero-rst-core/src/main/java/com.iamberry.rst.core/pts/PtsBatch.java
  2. 30 0
      watero-rst-core/src/main/java/com.iamberry.rst.core/pts/PtsBatchColor.java
  3. 25 0
      watero-rst-interface/src/main/java/com/iamberry/rst/faces/pts/PtsBatchService.java
  4. 44 0
      watero-rst-service/src/main/java/com/iamberry/rst/service/pts/PtsBatchServiceImpl.java
  5. 0 1
      watero-rst-service/src/main/java/com/iamberry/rst/service/pts/PtsBomServiceImpl.java
  6. 20 0
      watero-rst-service/src/main/java/com/iamberry/rst/service/pts/mapper/PtsBatchMapper.java
  7. 0 1
      watero-rst-service/src/main/java/com/iamberry/rst/service/pts/mapper/PtsBomMapper.java
  8. 49 0
      watero-rst-service/src/main/java/com/iamberry/rst/service/pts/mapper/ptsBatchMapper.xml
  9. 1 0
      watero-rst-service/src/main/java/com/iamberry/rst/service/pts/mapper/ptsBomMapper.xml
  10. 157 0
      watero-rst-web/src/main/java/com/iamberry/rst/controllers/pts/AdminPtsBatchController.java
  11. 76 43
      watero-rst-web/src/main/java/com/iamberry/rst/controllers/pts/AdminPtsBomController.java
  12. 1 0
      watero-rst-web/src/main/resources/watero-rst-orm.xml
  13. 263 0
      watero-rst-web/src/main/webapp/WEB-INF/views/pts/batch/add_batch.ftl
  14. 126 0
      watero-rst-web/src/main/webapp/WEB-INF/views/pts/batch/batch_list.ftl
  15. 12 3
      watero-rst-web/src/main/webapp/WEB-INF/views/pts/bom/add_bom.ftl
  16. 141 0
      watero-rst-web/src/main/webapp/WEB-INF/views/pts/bom/bom_details.ftl
  17. 14 71
      watero-rst-web/src/main/webapp/WEB-INF/views/pts/bom/bom_list.ftl
  18. 2 2
      watero-rst-web/src/main/webapp/WEB-INF/views/pts/bom/update_bom.ftl

+ 50 - 0
watero-rst-core/src/main/java/com.iamberry.rst.core/pts/PtsBatch.java

@@ -15,6 +15,10 @@ public class PtsBatch implements Serializable{
 
     private Integer batchQuantity;//批次数量
 
+    private Integer generatedQuantity;  //已生产的数量
+
+    private String batchColorQuantity; //批次不同颜色数量
+
     private Integer bomId;//bom单id
 
     private Integer produceId;//产品id
@@ -31,6 +35,12 @@ public class PtsBatch implements Serializable{
 
     private Date batchUpdateTime;//更新时间
 
+    private String produceName; //产品名称
+
+    private String bomName; //bom单id
+
+    private String softwareVersionNo; //软件版本号
+
     public Integer getBatchId() {
         return batchId;
     }
@@ -118,4 +128,44 @@ public class PtsBatch implements Serializable{
     public void setBatchUpdateTime(Date batchUpdateTime) {
         this.batchUpdateTime = batchUpdateTime;
     }
+
+    public String getBatchColorQuantity() {
+        return batchColorQuantity;
+    }
+
+    public void setBatchColorQuantity(String batchColorQuantity) {
+        this.batchColorQuantity = batchColorQuantity;
+    }
+
+    public String getProduceName() {
+        return produceName;
+    }
+
+    public void setProduceName(String produceName) {
+        this.produceName = produceName;
+    }
+
+    public String getBomName() {
+        return bomName;
+    }
+
+    public void setBomName(String bomName) {
+        this.bomName = bomName;
+    }
+
+    public String getSoftwareVersionNo() {
+        return softwareVersionNo;
+    }
+
+    public void setSoftwareVersionNo(String softwareVersionNo) {
+        this.softwareVersionNo = softwareVersionNo;
+    }
+
+    public Integer getGeneratedQuantity() {
+        return generatedQuantity;
+    }
+
+    public void setGeneratedQuantity(Integer generatedQuantity) {
+        this.generatedQuantity = generatedQuantity;
+    }
 }

+ 30 - 0
watero-rst-core/src/main/java/com.iamberry.rst.core/pts/PtsBatchColor.java

@@ -0,0 +1,30 @@
+package com.iamberry.rst.core.pts;
+
+import java.io.Serializable;
+
+/**
+ * 一个批次中 不同颜色机器的数量
+ */
+public class PtsBatchColor implements Serializable{
+    private static final long serialVersionUID = 2590891247107356748L;
+
+    private String colorName;
+
+    private Integer colorQuantity;
+
+    public String getColorName() {
+        return colorName;
+    }
+
+    public void setColorName(String colorName) {
+        this.colorName = colorName;
+    }
+
+    public Integer getColorQuantity() {
+        return colorQuantity;
+    }
+
+    public void setColorQuantity(Integer colorQuantity) {
+        this.colorQuantity = colorQuantity;
+    }
+}

+ 25 - 0
watero-rst-interface/src/main/java/com/iamberry/rst/faces/pts/PtsBatchService.java

@@ -0,0 +1,25 @@
+package com.iamberry.rst.faces.pts;
+
+import com.iamberry.rst.core.page.PagedResult;
+import com.iamberry.rst.core.pts.PtsBatch;
+import com.iamberry.rst.core.pts.PtsBatch;
+
+import java.util.List;
+
+/**
+ * 批次管理接口
+ */
+public interface PtsBatchService {
+
+    //查询bom单列表
+    PagedResult<PtsBatch> listPtsBatchPage(int pageNO, int pageSize, PtsBatch ptsBatch, boolean isTotalNum);
+
+    //添加批次
+    Integer savePtsBatch(PtsBatch ptsBatch);
+
+    //查询单个批次
+    PtsBatch getPtsBatch(PtsBatch ptsBatch);
+
+    //修改批次
+    Integer updatePtsBatch(PtsBatch ptsBatch);
+}

+ 44 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/pts/PtsBatchServiceImpl.java

@@ -0,0 +1,44 @@
+package com.iamberry.rst.service.pts;
+
+import com.github.pagehelper.PageHelper;
+import com.iamberry.rst.core.page.PagedResult;
+import com.iamberry.rst.core.pts.PtsBatch;
+import com.iamberry.rst.faces.pts.PtsBatchService;
+import com.iamberry.rst.service.pts.mapper.PtsBatchMapper;
+import com.iamberry.rst.util.PageUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 批次管理接口实现类
+ */
+@Service
+public class PtsBatchServiceImpl implements PtsBatchService {
+
+    @Autowired
+    private PtsBatchMapper ptsBatchMapper;
+
+    @Override
+    public PagedResult<PtsBatch> listPtsBatchPage(int pageNO, int pageSize, PtsBatch ptsBatch, boolean isTotalNum) {
+        PageHelper.startPage(pageNO, pageSize, isTotalNum);
+        List<PtsBatch> list = ptsBatchMapper.listPtsBatch(ptsBatch);
+        return PageUtil.getPage(list);
+    }
+
+    @Override
+    public Integer savePtsBatch(PtsBatch ptsBatch) {
+        return null;
+    }
+
+    @Override
+    public PtsBatch getPtsBatch(PtsBatch ptsBatch) {
+        return null;
+    }
+
+    @Override
+    public Integer updatePtsBatch(PtsBatch ptsBatch) {
+        return null;
+    }
+}

+ 0 - 1
watero-rst-service/src/main/java/com/iamberry/rst/service/pts/PtsBomServiceImpl.java

@@ -4,7 +4,6 @@ import com.github.pagehelper.PageHelper;
 import com.iamberry.rst.core.page.PagedResult;
 import com.iamberry.rst.core.pts.PtsBom;
 import com.iamberry.rst.core.pts.PtsBomComponents;
-import com.iamberry.rst.core.pts.PtsComponents;
 import com.iamberry.rst.faces.pts.PtsBomService;
 import com.iamberry.rst.service.pts.mapper.PtsBomMapper;
 import com.iamberry.rst.util.PageUtil;

+ 20 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/pts/mapper/PtsBatchMapper.java

@@ -0,0 +1,20 @@
+package com.iamberry.rst.service.pts.mapper;
+
+import com.iamberry.rst.core.pts.PtsBatch;
+
+import java.util.List;
+
+public interface PtsBatchMapper {
+
+    //查询批次列表
+    List<PtsBatch> listPtsBatch(PtsBatch ptsBatch);
+
+    //添加批次
+    Integer savePtsBatch(PtsBatch ptsBatch);
+
+    //查询单个批次
+    PtsBatch getPtsBatch(PtsBatch ptsBatch);
+
+    //修改批次
+    Integer updatePtsBatch(PtsBatch ptsBatch);
+}

+ 0 - 1
watero-rst-service/src/main/java/com/iamberry/rst/service/pts/mapper/PtsBomMapper.java

@@ -1,6 +1,5 @@
 package com.iamberry.rst.service.pts.mapper;
 
-import com.iamberry.rst.core.pts.Produce;
 import com.iamberry.rst.core.pts.PtsBom;
 import com.iamberry.rst.core.pts.PtsBomComponents;
 

+ 49 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/pts/mapper/ptsBatchMapper.xml

@@ -0,0 +1,49 @@
+<?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.iamberry.rst.service.pts.mapper.PtsBatchMapper">
+
+    <select id="listPtsBatch" parameterType="PtsBatch" resultType="PtsBatch">
+        SELECT
+            t.batch_id AS batchId,
+            t.batch_no AS batchNo,
+            t.batch_quantity AS batchQuantity,
+            t.batch_color_quantity AS batchColorQuantity,
+            t.bom_id AS bomId,
+            t.produce_id AS produceId,
+            t.batch_software_version_id AS batchSoftwareVersionId,
+            t.batch_status AS  batchStatus,
+            t.batch_desc AS batchDesc,
+            t.batch_create_time AS batchCreateTime,
+            t.batch_update_time AS batchUpdateTime,
+            trpp.produce_name AS produceName,
+            trpb.bom_name AS bomName,
+            tepmv.machine_version_no AS  softwareVersionNo,
+            count(tbpm.machine_id) AS generatedQuantity
+        FROM
+            	tb_rst_pts_batch t
+        LEFT JOIN tb_rst_pts_produce trpp ON t.produce_id = trpp.produce_id
+        LEFT JOIN tb_rst_pts_bom trpb ON t.bom_id = trpb.bom_id
+        LEFT JOIN tb_rst_pts_machine_version tepmv ON t.batch_software_version_id = tepmv.machine_version_id
+        LEFT JOIN tb_rst_pts_machine tbpm  ON t.batch_id = tbpm.machine_batch_id
+        <where>
+            <if test="produceId !=null">
+                AND t.produce_id = #{produceId}
+            </if>
+            <if test="batchNo !=null and batchNo !=''">
+                AND t.batch_no like CONCAT('%',#{batchNo},'%')
+            </if>
+        </where>
+    </select>
+
+    <select id="getPtsBatch" parameterType="PtsBatch" resultType="PtsBatch">
+
+    </select>
+
+    <insert id="savePtsBatch" parameterType="PtsBatch" useGeneratedKeys="true" keyProperty="batchId">
+
+    </insert>
+
+    <update id="updatePtsBatch" parameterType="PtsBatch">
+
+    </update>
+</mapper>

+ 1 - 0
watero-rst-service/src/main/java/com/iamberry/rst/service/pts/mapper/ptsBomMapper.xml

@@ -36,6 +36,7 @@
             </if>
         </where>
         GROUP BY trpb.bom_id
+        ORDER BY trpb.bom_id DESC
     </select>
 
     <select id="getPtsBom" parameterType="PtsBom" resultType="PtsBom">

+ 157 - 0
watero-rst-web/src/main/java/com/iamberry/rst/controllers/pts/AdminPtsBatchController.java

@@ -0,0 +1,157 @@
+package com.iamberry.rst.controllers.pts;
+
+import com.iamberry.rst.core.page.PagedResult;
+import com.iamberry.rst.core.pts.Produce;
+import com.iamberry.rst.core.pts.PtsBatch;
+import com.iamberry.rst.core.pts.PtsBom;
+import com.iamberry.rst.core.pts.PtsMachineVersion;
+import com.iamberry.rst.faces.pts.ProduceService;
+import com.iamberry.rst.faces.pts.PtsBatchService;
+import com.iamberry.rst.faces.pts.PtsBomService;
+import com.iamberry.rst.utils.StitchAttrUtil;
+import com.iamberry.wechat.tools.ResponseJson;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * 批次管理controller
+ *
+ * @author wxm
+ */
+@Controller
+@RequestMapping("/admin/batch")
+public class AdminPtsBatchController {
+
+    @Autowired
+    private PtsBatchService ptsBatchService;
+
+    @Autowired
+    private ProduceService produceService;
+
+    @Autowired
+    private PtsBomService ptsBomService;
+
+    /**
+     * 获取batch单列表
+     *
+     * @param request
+     * @return
+     */
+    @RequiresPermissions("batch:select:list")
+    @RequestMapping("/_batch_list")
+    public ModelAndView getPtsBatch(HttpServletRequest request, PtsBatch ptsBatch,
+                                    @RequestParam(value = "pageSize", defaultValue = "10", required = false) Integer pageSize,
+                                    @RequestParam(value = "pageNO", defaultValue = "1", required = false) Integer pageNO,
+                                    @RequestParam(value = "totalNum", defaultValue = "0", required = false) Integer totalNum) {
+        ModelAndView mv = new ModelAndView("pts/batch/batch_list");
+        PagedResult<PtsBatch> pagedResult = ptsBatchService.listPtsBatchPage(pageNO, pageSize, ptsBatch, totalNum == 0);
+        if (totalNum != 0) {
+            pagedResult.setTotal(totalNum);
+        }
+        StitchAttrUtil.setModelAndView(ptsBatch, mv, "/admin/batch/_batch_list", pagedResult);
+
+        //获取产品集合,用于页面选择产品
+        List<Produce> list = produceService.getProduceList();
+        mv.addObject("produceList", list);
+        return mv;
+    }
+
+
+    /**
+     * 跳转到添加batch单页面
+     *
+     * @return
+     */
+    @RequiresPermissions("batch:add:batch")
+    @RequestMapping(value = "/to_add_batch")
+    public ModelAndView toAddBom(HttpServletRequest request) {
+        ModelAndView mv = new ModelAndView("pts/batch/add_batch");
+
+        //获取产品集合,用于页面选择产品
+        List<Produce> produceList = produceService.getProduceList();
+
+        mv.addObject("produceList", produceList);
+        return mv;
+    }
+
+    /**
+     * 添加batch单
+     *
+     * @return
+     */
+    @ResponseBody
+    @RequiresPermissions("batch:add:batch")
+    @RequestMapping(value = "/save_batch")
+    public ResponseJson saveBom(PtsBatch ptsBatch, String batchComponentJson, HttpServletRequest request) {
+
+        if (!this.isValiData(ptsBatch) || batchComponentJson == null) {
+            return new ResponseJson(500, "ERROR", 500);
+        }
+
+        return new ResponseJson(200, "添加成功", 200);
+
+//        JSONArray jsonArray = JSONArray.fromObject(batchComponentJson);
+//        List<PtsBatchComponents> ptsBatchComponentsList = (List) JSONArray.toCollection(jsonArray, PtsBatchComponents.class);
+//        ptsBatch.setPtsBatchComponentsList(ptsBatchComponentsList);
+//
+//        Integer flag = ptsBatchService.savePtsBatch(ptsBatch);
+//
+//        if (flag < 1) {
+//            return new ResponseJson(500, "添加失败", 500);
+//        } else {
+//            return new ResponseJson(200, "添加成功", 200);
+//        }
+    }
+
+
+    /**
+     * 获取版本,根据produce
+     *
+     * @return
+     */
+    @ResponseBody
+    @RequiresPermissions(value = {"batch:add:batch", "batch:update:batch"}, logical = Logical.OR)
+    @RequestMapping(value = "/get_version")
+    public ResponseJson getBom(HttpServletRequest request) {
+
+        String produceId = request.getParameter("produceId");
+        if (produceId == null || "".equals(produceId)) {
+            return new ResponseJson(500, "ERROR", 500);
+        }
+
+        PtsMachineVersion ptsMachineVersion = new PtsMachineVersion();
+        ptsMachineVersion.setProduceId(Integer.valueOf(produceId));
+        List<PtsMachineVersion> ptsMachineVersionList = null; //ptsBomService.listPtsMachineVersionByPro(ptsMachineVersion);
+
+        if (ptsMachineVersionList != null) {
+            ResponseJson rj = new ResponseJson(200, "SUCCESS", 200);
+            rj.addResponseKeyValue("ptsMachineVersionList", ptsMachineVersionList);
+            return rj;
+        } else {
+            return new ResponseJson(500, "ERROR", 500);
+        }
+    }
+
+
+    /***
+     * 验证信息
+     * @param ptsBatch
+     * @return
+     */
+    public boolean isValiData(PtsBatch ptsBatch) {
+        boolean flag = true;
+
+        return flag;
+    }
+
+
+}

+ 76 - 43
watero-rst-web/src/main/java/com/iamberry/rst/controllers/pts/AdminPtsBomController.java

@@ -1,7 +1,10 @@
 package com.iamberry.rst.controllers.pts;
 
 import com.iamberry.rst.core.page.PagedResult;
-import com.iamberry.rst.core.pts.*;
+import com.iamberry.rst.core.pts.Produce;
+import com.iamberry.rst.core.pts.PtsBom;
+import com.iamberry.rst.core.pts.PtsBomComponents;
+import com.iamberry.rst.core.pts.PtsComponents;
 import com.iamberry.rst.faces.pts.MachinePartsService;
 import com.iamberry.rst.faces.pts.ProduceService;
 import com.iamberry.rst.faces.pts.PtsBomService;
@@ -11,7 +14,6 @@ import net.sf.json.JSONArray;
 import org.apache.shiro.authz.annotation.Logical;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -19,7 +21,6 @@ import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.servlet.ModelAndView;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -47,19 +48,19 @@ public class AdminPtsBomController {
      */
     @RequiresPermissions("bom:select:list")
     @RequestMapping("/_bom_list")
-    public ModelAndView getPtsBom(HttpServletRequest request,PtsBom ptsBom,
+    public ModelAndView getPtsBom(HttpServletRequest request, PtsBom ptsBom,
                                   @RequestParam(value = "pageSize", defaultValue = "10", required = false) Integer pageSize,
                                   @RequestParam(value = "pageNO", defaultValue = "1", required = false) Integer pageNO,
                                   @RequestParam(value = "totalNum", defaultValue = "0", required = false) Integer totalNum) {
         ModelAndView mv = new ModelAndView("pts/bom/bom_list");
         PagedResult<PtsBom> pagedResult = ptsBomService.listPtsBom(pageNO, pageSize, ptsBom, totalNum == 0);
-        if (totalNum != 0){
+        if (totalNum != 0) {
             pagedResult.setTotal(totalNum);
         }
 
         //获取产品集合,用于页面选择产品
         List<Produce> list = produceService.getProduceList();
-        mv.addObject("produceList",list);
+        mv.addObject("produceList", list);
 
         StitchAttrUtil.setModelAndView(ptsBom, mv, "/admin/bom/_bom_list", pagedResult);
         return mv;
@@ -71,14 +72,14 @@ public class AdminPtsBomController {
      * @return
      */
     @RequiresPermissions("bom:add:bom")
-    @RequestMapping(value="/to_add_bom")
-    public ModelAndView toAddBom(String BomId, HttpServletRequest request) {
+    @RequestMapping(value = "/to_add_bom")
+    public ModelAndView toAddBom(HttpServletRequest request) {
         ModelAndView mv = new ModelAndView("pts/bom/add_bom");
 
         //获取产品集合,用于页面选择产品
         List<Produce> produceList = produceService.getProduceList();
 
-        mv.addObject("produceList",produceList);
+        mv.addObject("produceList", produceList);
         return mv;
     }
 
@@ -89,29 +90,29 @@ public class AdminPtsBomController {
      */
     @ResponseBody
     @RequiresPermissions("bom:add:bom")
-    @RequestMapping(value="/save_bom")
+    @RequestMapping(value = "/save_bom")
     public ResponseJson saveBom(PtsBom ptsBom, String bomComponentJson, HttpServletRequest request) {
 
-        if(!this.isValiData(ptsBom) || bomComponentJson == null){
+        if (!this.isValiData(ptsBom) || bomComponentJson == null) {
             return new ResponseJson(500, "ERROR", 500);
         }
 
         JSONArray jsonArray = JSONArray.fromObject(bomComponentJson);
-        List<PtsBomComponents> ptsBomComponentsList  = (List) JSONArray.toCollection(jsonArray,PtsBomComponents.class);
+        List<PtsBomComponents> ptsBomComponentsList = (List) JSONArray.toCollection(jsonArray, PtsBomComponents.class);
         ptsBom.setPtsBomComponentsList(ptsBomComponentsList);
 
         Integer flag = ptsBomService.savePtsBom(ptsBom);
 
-        if (flag < 1 ){
+        if (flag < 1) {
             return new ResponseJson(500, "添加失败", 500);
-        }else {
+        } else {
             return new ResponseJson(200, "添加成功", 200);
         }
     }
 
-    public boolean isValiData(PtsBom ptsBom){
+    public boolean isValiData(PtsBom ptsBom) {
         boolean flag = true;
-        if(ptsBom.getBomName() != null && "".equals(ptsBom.getBomName())){
+        if (ptsBom.getBomName() != null && "".equals(ptsBom.getBomName())) {
 
         }
 
@@ -124,12 +125,12 @@ public class AdminPtsBomController {
      * @return
      */
     @ResponseBody
-    @RequiresPermissions(value={"bom:add:bom","bom:update:bom"},logical= Logical.OR)
-    @RequestMapping(value="/get_listBom")
+    @RequiresPermissions(value = {"bom:add:bom", "bom:update:bom"}, logical = Logical.OR)
+    @RequestMapping(value = "/get_listBom")
     public ResponseJson listBomByProduceId(HttpServletRequest request) {
 
         String produceId = request.getParameter("produceId");
-        if (produceId == null || "".equals(produceId)){
+        if (produceId == null || "".equals(produceId)) {
             return new ResponseJson(500, "ERROR", 500);
         }
 
@@ -137,11 +138,11 @@ public class AdminPtsBomController {
         ptsBom.setProduceId(Integer.valueOf(produceId));
         List<PtsBom> ptsBomsList = ptsBomService.listBom(ptsBom);
 
-        if (ptsBomsList != null ){
+        if (ptsBomsList != null) {
             ResponseJson rj = new ResponseJson(200, "SUCCESS", 200);
-            rj.addResponseKeyValue("ptsBomsList",ptsBomsList);
+            rj.addResponseKeyValue("ptsBomsList", ptsBomsList);
             return rj;
-        }else {
+        } else {
             return new ResponseJson(500, "ERROR", 500);
         }
     }
@@ -152,12 +153,12 @@ public class AdminPtsBomController {
      * @return
      */
     @ResponseBody
-    @RequiresPermissions(value={"bom:add:bom","bom:update:bom"},logical= Logical.OR)
-    @RequestMapping(value="/get_bom")
+    @RequiresPermissions(value = {"bom:add:bom", "bom:update:bom"}, logical = Logical.OR)
+    @RequestMapping(value = "/get_bom")
     public ResponseJson getBom(HttpServletRequest request) {
 
         String bomId = request.getParameter("bomId");
-        if (bomId == null || "".equals(bomId)){
+        if (bomId == null || "".equals(bomId)) {
             return new ResponseJson(500, "ERROR", 500);
         }
 
@@ -165,11 +166,11 @@ public class AdminPtsBomController {
         ptsBom.setBomId(Integer.valueOf(bomId));
         ptsBom = ptsBomService.getPtsBom(ptsBom);
 
-        if (ptsBom != null ){
+        if (ptsBom != null) {
             ResponseJson rj = new ResponseJson(200, "SUCCESS", 200);
-            rj.addResponseKeyValue("ptsBom",ptsBom);
+            rj.addResponseKeyValue("ptsBom", ptsBom);
             return rj;
-        }else {
+        } else {
             return new ResponseJson(500, "ERROR", 500);
         }
     }
@@ -180,12 +181,12 @@ public class AdminPtsBomController {
      * @return
      */
     @ResponseBody
-    @RequiresPermissions(value={"bom:add:bom","bom:update:bom"},logical= Logical.OR)
-    @RequestMapping(value="/get_listComponents")
+    @RequiresPermissions(value = {"bom:add:bom", "bom:update:bom"}, logical = Logical.OR)
+    @RequestMapping(value = "/get_listComponents")
     public ResponseJson listComponents(HttpServletRequest request) {
 
         String produceId = request.getParameter("produceId");
-        if (produceId == null || "".equals(produceId)){
+        if (produceId == null || "".equals(produceId)) {
             return new ResponseJson(500, "ERROR", 500);
         }
         PtsComponents ptsComponents = new PtsComponents();
@@ -194,11 +195,11 @@ public class AdminPtsBomController {
         //查询所有零件
         List<PtsComponents> ptsComponentsList = machinePartsService.listPtsComponents(ptsComponents);
 
-        if (ptsComponentsList != null ){
+        if (ptsComponentsList != null) {
             ResponseJson rj = new ResponseJson(200, "SUCCESS", 200);
-            rj.addResponseKeyValue("ptsComponentsList",ptsComponentsList);
+            rj.addResponseKeyValue("ptsComponentsList", ptsComponentsList);
             return rj;
-        }else {
+        } else {
             return new ResponseJson(500, "ERROR", 500);
         }
     }
@@ -210,10 +211,10 @@ public class AdminPtsBomController {
      */
     @ResponseBody
     @RequiresPermissions("bom:update:bom")
-    @RequestMapping(value="/to_update_bom")
+    @RequestMapping(value = "/to_update_bom")
     public ModelAndView toUpdateBom(String bomId, HttpServletRequest request) {
         ModelAndView mv = new ModelAndView("pts/bom/update_bom");
-        if (bomId == null || "".equals(bomId)){
+        if (bomId == null || "".equals(bomId)) {
             return mv;
         }
         //获取产品集合,用于页面选择产品
@@ -230,9 +231,9 @@ public class AdminPtsBomController {
         ptsComponents.setComponentsStatus(1);
         List<PtsComponents> ptsComponentsList = machinePartsService.listPtsComponents(ptsComponents);
 
-        mv.addObject("produceList",produceList);
-        mv.addObject("ptsBom",ptsBom);
-        mv.addObject("ptsComponentsList",ptsComponentsList);
+        mv.addObject("produceList", produceList);
+        mv.addObject("ptsBom", ptsBom);
+        mv.addObject("ptsComponentsList", ptsComponentsList);
         return mv;
     }
 
@@ -243,21 +244,53 @@ public class AdminPtsBomController {
      */
     @ResponseBody
     @RequiresPermissions("bom:add:bom")
-    @RequestMapping(value="/update_bom")
+    @RequestMapping(value = "/update_bom")
     public ResponseJson updateBom(PtsBom ptsBom, String bomComponentJson, HttpServletRequest request) {
 
         JSONArray jsonArray = JSONArray.fromObject(bomComponentJson);
-        List<PtsBomComponents> ptsBomComponentsList  = (List) JSONArray.toCollection(jsonArray,PtsBomComponents.class);
+        List<PtsBomComponents> ptsBomComponentsList = (List) JSONArray.toCollection(jsonArray, PtsBomComponents.class);
         ptsBom.setPtsBomComponentsList(ptsBomComponentsList);
 
         ptsBom.setProduceId(null);
 
         Integer flag = ptsBomService.updatePtsBom(ptsBom);
 
-        if (flag < 1 ){
+        if (flag < 1) {
             return new ResponseJson(500, "修改失败", 500);
-        }else {
+        } else {
             return new ResponseJson(200, "修改成功", 200);
         }
     }
+
+    /**
+     * 获取bom单详情
+     *
+     * @return
+     */
+    @ResponseBody
+    @RequiresPermissions("bom:select:details")
+    @RequestMapping(value = "/to_details_bom")
+    public ModelAndView toBomDetails(String bomId, HttpServletRequest request) {
+        ModelAndView mv = new ModelAndView("pts/bom/bom_details");
+        if (bomId == null || "".equals(bomId)) {
+            return mv;
+        }
+
+        //查询bom信息
+        PtsBom ptsBom = new PtsBom();
+        ptsBom.setBomId(Integer.valueOf(bomId));
+        ptsBom = ptsBomService.getPtsBom(ptsBom);
+
+        //所有零件
+        PtsComponents ptsComponents = new PtsComponents();
+        ptsComponents.setProduceId(ptsBom.getProduceId());
+        ptsComponents.setComponentsStatus(1);
+        List<PtsComponents> ptsComponentsList = machinePartsService.listPtsComponents(ptsComponents);
+
+        mv.addObject("ptsBom", ptsBom);
+        mv.addObject("ptsComponentsList", ptsComponentsList);
+        return mv;
+    }
+
+
 }

+ 1 - 0
watero-rst-web/src/main/resources/watero-rst-orm.xml

@@ -75,5 +75,6 @@
 		<mapper resource="com/iamberry/rst/service/pts/mapper/ptsBomMapper.xml"/>
 		<mapper resource="com/iamberry/rst/service/pts/mapper/machinePartsMapper.xml"/>
 		<mapper resource="com/iamberry/rst/service/pts/mapper/machineSupplierMapper.xml"/>
+		<mapper resource="com/iamberry/rst/service/pts/mapper/ptsBatchMapper.xml"/>
 	</mappers>
 </configuration>

+ 263 - 0
watero-rst-web/src/main/webapp/WEB-INF/views/pts/batch/add_batch.ftl

@@ -0,0 +1,263 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta http-equiv="Cache-Control" content="no-siteapp"/>
+<#include "/base/add_base.ftl">
+    <link href="${path}/common/lib/jquery.ui/jquery-ui.css" rel="stylesheet" type="text/css"/>
+    <style>
+        .add-list>li{margin: 10px 0;}
+        input[type=radio]{-webkit-appearance:none;appearance:none;background: url(/rst/common/images/pts/radio-1.png) center center no-repeat;background-size:auto 100%;width: 20px;height: 20px;margin-right: 10px;}
+        input[type=radio]:checked{-webkit-appearance:none;appearance:none;background: url(/rst/common/images/pts/radio-2.png) center center no-repeat;background-size:auto 100%;width: 20px;height: 20px;margin-right: 10px;}
+    </style>
+    <title>添加批次 - 批次管理 - RST</title>
+</head>
+<body>
+<nav class="breadcrumb"><i class="Hui-iconfont">&#xe67f;</i> 首页
+    <span class="c-gray en">&gt;</span> 批次管理
+    <span class="c-gray en">&gt;</span> 添加批次
+    <a class="btn radius r"
+       style="line-height:1.6em;margin-top:3px;background: #32a3d8;color: #fff;border:1px solid #32a3d8;"
+       href="javascript:location.replace(location.href);" title="刷新"><i class="Hui-iconfont">&#xe68f;</i></a>
+</nav>
+<article class="page-container" style="padding: 10px;width: 600px;margin: 0 auto;">
+    <form action="${path}/admin/batch/save_batch" method="post" class="form form-horizontal" id="form-batch-add">
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>所属产品:</label>
+            <div class="formControls col-xs-8 col-sm-9"> <span class="select-box">
+				<select class="select" size="1" name="produceId">
+                <#if produceList?? &&  (produceList?size > 0) >
+                    <#list produceList as produce>
+                        <option value="${produce.produceId}" >${produce.produceName}</option>
+                    </#list>
+                <#else>
+                    <option value="">暂时没有产品,需要到生产产品页面添加产品</option>
+                </#if>
+				</select>
+				</span>
+            </div>
+        </div>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>批次编号:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+				<input type="text" class="input-text" value="" id="batchNo" name="batchNo" placeholder="请输入1-20位的名称,支持字母、数字" datatype="/^[a-zA-Z0-9\u4e00-\u9fa5]{1,20}$/" errormsg="请输入1-20位的名称,支持字母、数字!">
+            </div>
+        </div>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>批次数量:</label>
+            <div class="formControls col-xs-8 col-sm-9 components">
+                <input type="hidden" id="batchColorJson" name="batchColorJson">
+                <table class="table table-border table-bordered table-bg table-hover table-sort">
+                    <thead>
+                    <tr class="text-c">
+                        <th width="150">选择颜色</th>
+                        <th width="60">批次数量</th>
+                        <th width="20">操作</th>
+                    </tr>
+                    </thead>
+                    <tbody id="batchColorAll">
+                    </tbody>
+                </table>
+            </div>
+        </div>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>批次总数量:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+				<input type="text" class="input-text" value="" id="batchQuantity" name="batchQuantity" placeholder="该批次的总数量,只能输入数字且不能超过999999" datatype="n1-3" errormsg="批次数量只能输入数字且不能超过999999!">
+            </div>
+        </div>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-3">软件版本:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <span class="select-box">
+				    <select class="select" size="1" name="batchSoftwareVersionId" id="batchSoftwareVersionId">
+				    </select>
+				</span>
+            </div>
+        </div>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-3">Bom单:</label>
+            <div class="formControls col-xs-8 col-sm-9"> <span class="select-box">
+				<select class="select" size="1" name="bomId" id="bomId">
+				</select>
+				</span>
+            </div>
+        </div>
+
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-3">批次状态:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <div class="radio-box">
+                    <input type="radio" id="batchStatus-1" name="batchStatus" checked >
+                    <label for="batchStatus-1">立即使用</label>
+                </div>
+                <div class="radio-box">
+                    <input type="radio" id="batchStatus-2" name="batchStatus">
+                    <label for="batchStatus-2">暂不使用</label>
+                </div>
+            </div>
+        </div>
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-3">批次描述:</label>
+            <div class="formControls col-xs-8 col-sm-9">
+                <textarea name="batchDesc" id="batchDesc" cols="" rows="" class="textarea"
+                          placeholder="批次描述,最多支持100字符" onKeyUp="$.Huitextarealength(this,100)" ></textarea>
+                <p class="textarea-numberbar"><em class="textarea-length">0</em>/100</p>
+            </div>
+        </div>
+
+
+
+        <div class="row cl">
+            <label class="form-label col-xs-4 col-sm-3"></label>
+            <span class="c-red">*提示</span><span>:如果设置状态为 使用,将停止使用同一个产品的其他批次!</span>
+        </div>
+        <div class="row cl">
+            <div class="col-xs-8 col-sm-9 col-xs-offset-4 col-sm-offset-3">
+                <input class="btn btn-primary radius" type="submit" value="&nbsp;&nbsp;提交&nbsp;&nbsp;">
+            </div>
+        </div>
+    </form>
+</article>
+<script type="text/javascript">
+
+    $(function(){
+        $("#form-batch-add").Validform({
+            tiptype: function (msg, o, cssctl) {
+                if (o.type == 3) {//失败
+                    layer.msg(msg, {icon: 5, time: 3000});
+                    $(window).scrollTop(o.obj.offset().top - 40);
+                }
+            },
+            datatype: {//自定义验证类型
+                "select": function (gets, obj, curform, regxp) {
+                    if (gets == "") {
+                        return false;
+                    } else {
+                        return true;
+                    }
+                }
+            },
+            ignoreHidden: true,
+            tipSweep: true, //若为true,则只在表单提交时验证
+            ajaxPost: true, //异步提交
+            beforeCheck: function (curform) {  //验证通过之前执行的函数
+            },
+            beforeSubmit: function (curform) {  //验证通过之后执行的函数
+            },
+            callback: function (data) {//异步回调函数
+                if (data) {
+                    var index = layer.alert(data.resultMsg, function () {
+                        if (data.resultCode == 200) {
+                            location.href = "${path}/admin/batch/_batch_list";
+                        } else {
+                            layer.close(index);
+                        }
+                    });
+                }
+            }
+        });
+    })
+
+    /*颜色枚举值全局变量*/
+    var colorAll = ['黑','红','橙','黄','绿','青','蓝','紫','白']
+
+    $(function () {
+        /*添加页面初始化,将根据产品的来获取bom和软件版本*/
+        var produceId =   $("[name='produceId']").val();
+        getBomByProduce(produceId);
+        getVersionByProduce(produceId);
+
+        /*初始化一个颜色*/
+        addBatchColor();
+
+        /*监听产品选择*/
+//        $("[name='produceId']").change(function(){
+//            var produceId = $(this).val();
+//            getBomByProduce(produceId);
+//        })
+    })
+
+    /*根据产品id,获取bom集合*/
+    function getBomByProduce(produceId){
+        $.ajax({
+            type: "POST",
+            data: {
+                produceId : produceId
+            },
+            url: "${path}/admin/bom/get_listBom",
+            async: false,
+            success: function(data){
+                var html = '';
+                if (data.returnCode == 200) {
+                    var bomList = data.returnMsg.ptsBomsList;
+                    for(var i=0;i<bomList.length;i++){
+                        html += '<option value="'+ bomList[i].bomId +'">'+ bomList[i].bomName +'</option>';
+                    }
+                }
+                if(data.returnCode != 200 || data.returnMsg.ptsBomsList <1){
+                    layer.msg('系统没有对应产品的Bom单,请到Bom单管理中添加Bom', {icon: 5, time: 3000});
+                }
+                $("[name='bomId']").html(html);
+            },
+            error: function(XmlHttpRequest, textStatus, errorThrown){
+            }
+        });
+    }
+
+    /*根据产品获取软件版本*/
+    function getVersionByProduce(produceId) {
+        $.ajax({
+            type: "POST",
+            data: {
+                produceId : produceId
+            },
+            url: "${path}/admin/batch/get_listBatch",
+            async: false,
+            success: function(data){
+                var html = '';
+                if (data.returnCode == 200) {
+                    var versionList = data.returnMsg.ptsMachineVersionList;
+                    for(var i=0;i<versionList.length;i++){
+                        html += '<option value="'+ versionList[i].machineVersionId +'">'+ versionList[i].machineVersionName +'('+ versionList[i].machineVersionNo +')</option>';
+                    }
+                }
+                if(data.returnCode != 200 || data.returnMsg.ptsMachineVersionList <1){
+                    layer.msg('系统没有对应产品的Bom单,请到Bom单管理中添加Bom', {icon: 5, time: 3000});
+                }
+                $("[name='bomId']").html(html);
+            },
+            error: function(XmlHttpRequest, textStatus, errorThrown){
+            }
+        });
+    }
+
+    /*添加颜色*/
+    function addBatchColor() {
+        //获取颜色枚举值
+        getColorAll();
+
+    }
+
+    /*获取颜色枚举值*/
+    function getColorAll() {
+        for(var i++; i<colorAll.length;i++){
+
+        }
+    }
+</script>
+<!--/请在上方写此页面业务相关的脚本-->
+</body>
+</html>

+ 126 - 0
watero-rst-web/src/main/webapp/WEB-INF/views/pts/batch/batch_list.ftl

@@ -0,0 +1,126 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+    <meta http-equiv="Cache-Control" content="no-siteapp" />
+    <link rel="Bookmark" href="/favicon.ico" >
+    <link rel="Shortcut Icon" href="/favicon.ico" />
+<#include "/base/list_base.ftl">
+    <title>批次列表</title>
+    <style>
+        *{padding: 0;margin: 0;}
+        .my-input{border: 1px solid rgba(0,0,0,.1);padding: 1px 5px;height: 32px;margin-right: 10px;}
+        .my-input::-webkit-input-placeholder,.my-select{color: #dcdcdc;}
+        .my-select{border: 1px solid rgba(0,0,0,.1);padding:6px 50px 6px 15px;height: 34px;margin: 0 10px; -webkit-appearance:none;appearance:none;background: url(/rst/common/images/pts/select-1.png) right center no-repeat;background-size:auto 100%;}
+        .my-btn-search{border: 1px solid #32a3d8;padding: 1px 25px;height: 32px;background-color: #32a3d8;color: #fff;}
+        .barcodeImg{margin:10px 0px}
+        .table-bg thead th{background-color: #e2f6ff;}
+        input[type=radio]{-webkit-appearance:none;appearance:none;background: url(/rst/common/images/pts/radio-1.png) center center no-repeat;background-size:auto 100%;width: 20px;height: 20px;margin-right: 10px;}
+        input[type=radio]:checked{-webkit-appearance:none;appearance:none;background: url(/rst/common/images/pts/radio-2.png) center center no-repeat;background-size:auto 100%;width: 20px;height: 20px;margin-right: 10px;}
+    </style>
+</head>
+<body>
+<nav class="breadcrumb"><i class="Hui-iconfont">&#xe67f;</i> 首页
+    <span class="c-gray en">&gt;</span> 批次管理
+    <span class="c-gray en">&gt;</span> 批次列表
+    <a class="btn radius r" style="line-height:1.6em;margin-top:3px;background: #32a3d8;color: #fff;border:1px solid #32a3d8;" href="javascript:location.replace(location.href);" title="刷新" ><i class="Hui-iconfont">&#xe68f;</i></a>
+</nav>
+<div class="page-container">
+    <div class="text-c">
+        <form action="${path}/admin/batch/_batch_list" method="post">
+            <button type="button" style="cursor:pointer; float: left;" class="my-btn-search" onclick="toAddBom();">增加批次</button>
+            <select class="my-select" name="produceId" style="height: 36px;width: 150px">
+                <option value ="">所有产品</option>
+                <#if produceList?? &&  (produceList?size > 0) >
+                    <#list produceList as produce>
+                        <option value ="${produce.produceId!}" <#if produceId??><#if produceId ==produce.produceId >selected="selected"</#if></#if>>${produce.produceName!}</option>
+                    </#list>
+                </#if>
+            </select>
+            <input type="text" class="my-input"  style="width:150px" value="${batchNo!''}" placeholder="批次编号" id="batchNo" name="batchNo">
+            <button type="submit" class="btn" style="background: #32a3d8;color: #fff;-webkit-transform:translateY(-5%);" id="" name=""><i class="Hui-iconfont">&#xe665;</i> 搜索</button>
+        </form>
+    </div>
+
+    <div class="mt-20">
+        <table class="table table-border table-bordered table-bg table-hover table-sort">
+        <thead>
+        <tr class="text-c">
+            <th width="50">所属产品</th>
+            <th width="60">批次编号</th>
+            <th width="100">总数量</th>
+            <th width="80">生产数量</th>
+            <th width="80">状态</th>
+            <th width="100">软件版本</th>
+            <th width="80">Bom单名称</th>
+            <th width="80">时间</th>
+            <th width="80">操作</th>
+        </tr>
+        </thead>
+        <tbody>
+            <#if page.dataList?? &&  (page.dataList?size > 0) >
+                    <#list page.dataList as batch>
+                        <tr class="text-c">
+                            <td>${batch.produceName!''}</td>
+                            <td>${batch.batchNo!''}</td>
+                            <td>${batch.batchQuantity!'0'}</td>
+                            <td>${batch.generatedQuantity!'0'}</td>
+                            <td>
+                                <#if batch.batchStatus??>
+                                    <#if batch.batchStatus == 1>正常使用</#if>
+                                    <#if batch.batchStatus == 0>已停用</#if>
+                                </#if>
+                            </td>
+                            <td>${batch.softwareVersionNo!''}</td>
+                            <td>${batch.bomName!''}</td>
+                            <td>${(batch.batchCreateTime?string("yyyy-MM-dd HH:mm:ss"))!''}</td>
+                            <td>
+                                <a style="text-decoration:none" href="javascript:void(0);" title="编辑" onclick="admin_update_batch(${batch.batchId!''})">
+                                    <i class="Hui-iconfont">&#xe6df;</i>
+                                </a>&nbsp;
+                                <a style="text-decoration:none" href="javascript:void(0);" title="查看batch单详情" onclick="admin_details_batch(${batch.batchId!''})">
+                                    <i class="Hui-iconfont">&#xe665;</i>
+                                </a>
+                            </td>
+                        </tr>
+                    </#list>
+            <#else>
+                <tr><td colspan="9" class="td-manage text-c" >暂时没有批次,请添加!</td></tr>
+            </#if>
+        </tbody>
+    </table>
+    </div>
+</div>
+<tfoot>
+<#include "/base/page_util.ftl">
+</tfoot>
+<script>
+    /**
+     * 跳转到添加batch页面
+     */
+    function toAddBom(){
+        window.location.href= "${path}/admin/batch/to_add_batch";
+    }
+
+    /**
+     *跳转到编辑页面
+     * @param employee
+     */
+    function admin_update_batch(batchId) {
+        window.location.href= "${path}/admin/batch/to_update_batch?batchId="+batchId;
+    }
+
+    /**
+     *跳转到详情页面
+     * @param employee
+     */
+    function admin_details_batch(batchId) {
+        window.location.href= "${path}/admin/batch/to_details_batch?batchId="+batchId;
+    }
+
+</script>
+</body>
+</html>

+ 12 - 3
watero-rst-web/src/main/webapp/WEB-INF/views/pts/bom/add_bom.ftl

@@ -10,6 +10,9 @@
 <#include "/base/add_base.ftl">
     <link href="${path}/common/lib/jquery.ui/jquery-ui.css" rel="stylesheet" type="text/css"/>
     <style>
+        .add-list>li{margin: 10px 0;}
+        input[type=radio]{-webkit-appearance:none;appearance:none;background: url(/rst/common/images/pts/radio-1.png) center center no-repeat;background-size:auto 100%;width: 20px;height: 20px;margin-right: 10px;}
+        input[type=radio]:checked{-webkit-appearance:none;appearance:none;background: url(/rst/common/images/pts/radio-2.png) center center no-repeat;background-size:auto 100%;width: 20px;height: 20px;margin-right: 10px;}
     </style>
     <title>添加Bom - Bom管理 - RST</title>
 </head>
@@ -52,7 +55,7 @@
         <div class="row cl">
             <label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>Bom名称:</label>
             <div class="formControls col-xs-8 col-sm-9">
-                <input type="text" class="input-text" value="" id="bomName" name="bomName" placeholder="请输入1-30位的名称,支持中文、字母、数字" datatype="/^[a-zA-Z0-9\u4e00-\u9fa5]{1,30}$/" errormsg="请输入1-30位的名称,支持中文、字母、数字!">
+                <input type="text" class="input-text" value="" id="bomName" name="bomName" placeholder="请输入1-20位的名称,支持中文、字母、数字" datatype="/^[a-zA-Z0-9\u4e00-\u9fa5]{1,20}$/" errormsg="请输入1-20位的名称,支持中文、字母、数字!">
             </div>
         </div>
 
@@ -139,7 +142,7 @@
             callback: function (data) {//异步回调函数
                 if (data) {
                     var index = layer.alert(data.resultMsg, function () {
-                        if (data.Success) {
+                        if (data.resultCode == 200) {
                             location.href = "${path}/admin/bom/_bom_list";
                         } else {
                             layer.close(index);
@@ -216,7 +219,13 @@
                 $(this).remove();
             })
         }else{
-            $(node).parent().parent().remove();
+            //删除零件必须保证还有一个零件
+            var componentLength = $("#componentaAll").find("tr").length;
+            if(componentLength > 1){
+                $(node).parent().parent().remove();
+            }else{
+                layer.msg('必须要有一个零件', {icon: 5, time: 3000});
+            }
         }
     }
 

+ 141 - 0
watero-rst-web/src/main/webapp/WEB-INF/views/pts/bom/bom_details.ftl

@@ -0,0 +1,141 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="renderer" content="webkit|ie-comp|ie-stand">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport"
+          content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta http-equiv="Cache-Control" content="no-siteapp"/>
+<#include "/base/add_base.ftl">
+    <link href="${path}/common/lib/jquery.ui/jquery-ui.css" rel="stylesheet" type="text/css"/>
+    <style>
+        .content { width: 100%; margin: 0 auto;font-size: 12px;}
+        .my-title{font-weight: 500;padding-left: 15px;position: relative;}
+        .my-title:after{content: '';position: absolute;left: 0;top:12%;width: 3px;height: 80%;background: #32a3d8;}
+        .my-input{padding: 5px 10px;width: 80%;border:1px solid rgba(0,0,0,.1);}
+        .my-span{padding: 5px 10px;width: 80%;}
+        .my-input-date{padding: 5px 10px;border:1px solid rgba(0,0,0,.1);width: 80%;background: url(${path}/common/images/pts//rili-1.png) 98.5% center no-repeat; background-size:auto 80%;}
+        .input-box{margin: 18px 0;}
+        .input-dic{float: left;margin:5px 10px 0 0;font-size: 12px;}
+        .add-list{list-style-type: none;padding: 10px;background-color: #f5f5f5;width: 60%;float: left;margin: 0;}
+        .add-list>li{margin: 10px 0;}
+        .my-textarea{padding: 5px 10px;width: 80%;border:1px solid rgba(0,0,0,.1);}
+        .my-btn-reset{padding: 6px 20px;width: 150px; background-color: #fff;color: #32a3d8;border: 1px solid #32a3d8;cursor:pointer;margin: 10px 10px 0 10px;}
+        .my-btn-submit{padding: 6px 20px;width: 150px; background-color: #32a3d8;color: #fff;border: 1px solid #32a3d8;cursor:pointer;margin: 10px 10px 0 10px;}
+        .my-select{border: 1px solid rgba(0,0,0,.1);padding:6px 50px 6px 15px;width: 60%; height: 34px;margin: 0 10px; -webkit-appearance:none;appearance:none;background: url(${path}/common/images/pts/select-1.png) right center no-repeat #fff;background-size:auto 100%;}
+        input[type=radio]{-webkit-appearance:none;appearance:none;background: url(/rst/common/images/pts/radio-1.png) center center no-repeat;background-size:auto 100%;width: 20px;height: 20px;margin-right: 10px;}
+        input[type=radio]:checked{-webkit-appearance:none;appearance:none;background: url(/rst/common/images/pts/radio-2.png) center center no-repeat;background-size:auto 100%;width: 20px;height: 20px;margin-right: 10px;}
+        .my-con-right{width: 80px;float: left; text-align: right; }
+        .my-con-left{width: 80%; display: block; float: left;padding-left: 20px; font-size: 14px;line-height: 20px;}
+        .my-con-text{width: 80%; padding-left: 8px; }
+        .my-btn-search{border: 1px solid #32a3d8;padding: 1px 25px;height: 32px;background-color: #32a3d8;color: #fff;}
+    </style>
+    <title>Bom单详情 - Bom管理 - RST</title>
+</head>
+<body>
+<nav class="breadcrumb"><i class="Hui-iconfont">&#xe67f;</i> 首页
+    <span class="c-gray en">&gt;</span> Bom管理
+    <span class="c-gray en">&gt;</span> Bom单详情
+    <a class="btn radius r"
+       style="line-height:1.6em;margin-top:3px;background: #32a3d8;color: #fff;border:1px solid #32a3d8;"
+       href="javascript:location.replace(location.href);" title="刷新"><i class="Hui-iconfont">&#xe68f;</i></a>
+</nav>
+<article class="page-container">
+    <form action="${path}/admin/bom/update_bom" method="post" class="form form-horizontal" id="form-bom-update">
+        <button type="button" style="cursor:pointer; float: left;" class="my-btn-search" onclick="reback();">&lt;&lt;返回Bom列表</button></br></br>
+
+        <div style="padding: 10px;">
+            <div class="my-title">Bom单详情</div>
+            <input type="hidden" value="${ptsBom.bomId}" id="bomId" name="bomId">
+            <input type="hidden" value="${ptsBom.produceId}" id="produceId" name="produceId">
+
+            <div class="input-box">
+                <span class="my-con-right content">所属产品:</span>&nbsp;&nbsp;
+                <span class="my-con-left content">${ptsBom.produceName}</span>
+            </div>
+
+            <div class="input-box">
+                <span class="my-con-right content">Bom名称:</span>&nbsp;&nbsp;
+                <span class="my-con-left content">${ptsBom.bomName}</span>
+            </div>
+
+            <div class="input-box">
+                <span class="my-con-right content">Bom备注:</span>&nbsp;&nbsp;
+                <span class="my-con-text content">${ptsBom.bomRemarks ! ''}</span>
+            </div>
+
+            <div class="input-box">
+                <span class="my-con-right content">零件总成本:</span>&nbsp;&nbsp;
+                <span class="my-con-text content"><#if ptsBom.allComponentsCost?? >${ptsBom.allComponentsCost/100}</#if>(元)</span>
+            </div>
+
+            <div class="input-box">
+                <span class="my-con-right content">零件总重量:</span>&nbsp;&nbsp;
+                <span class="my-con-text content">${ptsBom.allComponentsWeight ! ''}(g)</span>
+            </div>
+
+            <div class="my-title">Bom零件清单</div>
+
+            <div class="row cl" style="margin-left: 20px">
+                <div class="formControls col-xs-8 col-sm-9 components" style=" padding-left: 0px;">
+                    <input type="hidden" id="bomComponentJson" name="bomComponentJson">
+                    <table class="table table-border table-bordered table-bg table-hover table-sort">
+                        <thead>
+                        <tr class="text-c">
+                            <th width="80">零件编号</th>
+                            <th width="">零件名称</th>
+                            <th width="">零件数量</th>
+                            <th width="">零件成本(元)</th>
+                            <th width="">零件净重(g)</th>
+                            <th width="">零件供应商</th>
+                        </tr>
+                        </thead>
+                        <tbody id="componentaAll">
+                        <#if ptsBom.ptsBomComponentsList?? &&  (ptsBom.ptsBomComponentsList?size > 0) >
+                            <#list ptsBom.ptsBomComponentsList  as bomComponents>
+                                <#list ptsComponentsList as ptsComponents>
+                                    <#if bomComponents.componentsId == ptsComponents.componentsId >
+                                        <#assign compont = ptsComponents/>
+                                    </#if>
+                                </#list>
+
+                            <tr class="text-c">
+                                <td>
+                                    ${compont.componentsNo}
+                                </td>
+                                <td>
+                                    ${compont.componentsName}
+                                </td>
+                                <td>
+                                    ${bomComponents.bomComponentsQuantity}
+                                </td>
+                                <td>
+                                    <#if compont.componentsCost?? >${compont.componentsCost/100}</#if>
+                                </td>
+                                <td>
+                                    ${compont.componentsWeight}
+                                </td>
+                                <td>
+                                    ${compont.supplierName}
+                                </td>
+                            </tr>
+                            </#list>
+                        </#if>
+                        </tbody>
+                    </table>
+                </div>
+            </div>
+        </div>
+    </form>
+</article>
+<script type="text/javascript">
+
+    /*返回列表*/
+    function reback() {
+        window.history.back();
+    }
+</script>
+<!--/请在上方写此页面业务相关的脚本-->
+</body>
+</html>

+ 14 - 71
watero-rst-web/src/main/webapp/WEB-INF/views/pts/bom/bom_list.ftl

@@ -55,7 +55,7 @@
             <th width="60">所属产品</th>
             <th width="100">bom名称</th>
             <th width="80">零件总成本(元)</th>
-            <th width="80">零件总重(KG)</th>
+            <th width="80">零件总重(g)</th>
             <th width="100">备注</th>
             <th width="80">最近修改时间</th>
             <th width="80">添加时间</th>
@@ -70,13 +70,16 @@
                             <td>${bom.produceName!''}</td>
                             <td>${bom.bomName!''}</td>
                             <td><#if bom.allComponentsCost?? >${bom.allComponentsCost/100}</#if></td>
-                            <td><#if bom.allComponentsWeight?? >${bom.allComponentsWeight/1000}</#if></td>
+                            <td><#if bom.allComponentsWeight?? >${bom.allComponentsWeight}</#if></td>
                             <td>${bom.bomRemarks!''}</td>
                             <td>${(bom.bomUpdateTime?string("yyyy-MM-dd HH:mm:ss"))!''}</td>
                             <td>${(bom.bomCreateTime?string("yyyy-MM-dd HH:mm:ss"))!''}</td>
                             <td>
                                 <a style="text-decoration:none" href="javascript:void(0);" title="编辑" onclick="admin_update_bom(${bom.bomId!''})">
                                     <i class="Hui-iconfont">&#xe6df;</i>
+                                </a>&nbsp;
+                                <a style="text-decoration:none" href="javascript:void(0);" title="查看bom单详情" onclick="admin_details_bom(${bom.bomId!''})">
+                                    <i class="Hui-iconfont">&#xe665;</i>
                                 </a>
                             </td>
                         </tr>
@@ -91,75 +94,6 @@
 <tfoot>
 <#include "/base/page_util.ftl">
 </tfoot>
-<script type="text/javascript">
-    /*
-        参数解释:
-        title	标题
-        url		请求的url
-        id		需要操作的数据id
-        w		弹出层宽度(缺省调默认值)
-        h		弹出层高度(缺省调默认值)
-    */
-
-
-    /*子页面添加完信息后回显添加结果是否成功*/
-    function admin_result(str,num) {
-        layer.msg(str,{icon:num,time:1000});
-    }
-
-    function edit_process(url) {
-        window.location.href = url
-    }
-
-    /*管理员-详情*/
-    function admin_add_filter(url){
-        window.location.href= url;
-    }
-    /*管理员-删除*/
-    function admin_del(obj,id){
-        layer.confirm('确认要删除吗?',function(index){
-            $.ajax({
-                type: 'POST',
-                url: '',
-                dataType: 'json',
-                success: function(data){
-                    $(obj).parents("tr").remove();
-                    layer.msg('已删除!',{icon:1,time:1000});
-                },
-                error:function(data) {
-                    console.log(data.msg);
-                },
-            });
-        });
-    }
-
-    /*管理员-编辑*/
-    function admin_edit(title,url,id,w,h){
-        layer_show(title,url,w,h);
-    }
-    /* 录入FAQ */
-    function add_FAQ(menuId,type) {
-        window.location.href= root_path + "/admin/faq/_add_FAQ?menuId="+menuId+"&menuType="+type;
-       // layer_show("增加FAQ", root_path + "/admin/faq/_add_FAQ?menuId="+menuId+"&menuType="+type);
-    }
-
-    /* 修改二级菜单状态 */
-    function update_FAQState(detaId) {
-        layer.confirm('确认要停用吗?',function(index){
-            $.post(root_path + "/admin/faq/updat_FAQState",{detaId:detaId}, function(result){
-                if (result.returnCode != 200 || result.returnCode != 200) {
-                    layer.msg('修改失败,请重试!',{icon: 5,time:3000});
-                } else {
-                    layer.msg('修改成功!',{icon: 1,time:2000}, function () {
-                        // 关闭当前页面,并刷新父级页面
-                        window.location.reload();
-                    });
-                }
-            });
-        });
-    }
-
-</script>
 <script>
     /**
      * 跳转到添加bom页面
@@ -175,6 +109,15 @@
     function admin_update_bom(bomId) {
         window.location.href= "${path}/admin/bom/to_update_bom?bomId="+bomId;
     }
+
+    /**
+     *跳转到详情页面
+     * @param employee
+     */
+    function admin_details_bom(bomId) {
+        window.location.href= "${path}/admin/bom/to_details_bom?bomId="+bomId;
+    }
+
 </script>
 </body>
 </html>

+ 2 - 2
watero-rst-web/src/main/webapp/WEB-INF/views/pts/bom/update_bom.ftl

@@ -44,7 +44,7 @@
         <div class="row cl">
             <label class="form-label col-xs-4 col-sm-3"><span class="c-red">*</span>Bom名称:</label>
             <div class="formControls col-xs-8 col-sm-9">
-                <input type="text" class="input-text" value="${ptsBom.bomName}" id="bomName" name="bomName" placeholder="请输入1-30位的名称,支持中文、字母、数字" datatype="/^[a-zA-Z0-9\u4e00-\u9fa5]{1,30}$/" errormsg="请输入1-30位的名称,支持中文、字母、数字!">
+                <input type="text" class="input-text" value="${ptsBom.bomName}" id="bomName" name="bomName" placeholder="请输入1-20位的名称,支持中文、字母、数字" datatype="/^[a-zA-Z0-9\u4e00-\u9fa5]{1,20}$/" errormsg="请输入1-20位的名称,支持中文、字母、数字!">
             </div>
         </div>
 
@@ -148,7 +148,7 @@
             callback: function (data) {//异步回调函数
                 if (data) {
                     var index = layer.alert(data.resultMsg, function () {
-                        if (data.Success) {
+                        if (data.resultCode == 200 ) {
                             location.href = "${path}/admin/bom/_bom_list";
                         } else {
                             layer.close(index);