From 8d9cd0d896b96a3209a0e0d99ef8a05e2d19b8a0 Mon Sep 17 00:00:00 2001 From: "zangch@mesnac.com" Date: Wed, 18 Mar 2026 17:31:51 +0800 Subject: [PATCH] =?UTF-8?q?add:=20=E5=AE=9E=E7=8E=B0=E5=B7=A5=E4=BD=8D?= =?UTF-8?q?=E8=83=BD=E5=8A=9B=E7=BB=B4=E6=8A=A4=E3=80=81=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E5=B7=A5=E8=89=BA=E8=B7=AF=E7=BA=BF=E7=BB=B4=E6=8A=A4=E3=80=81?= =?UTF-8?q?=E7=8F=AD=E7=BB=84=E6=8E=92=E7=8F=AD=E7=BB=B4=E3=80=81=E5=B7=A5?= =?UTF-8?q?=E5=8D=95=E5=A4=87=E6=B3=A8=E4=B8=8E=E5=BC=82=E5=B8=B8=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E3=80=81=E7=94=9F=E4=BA=A7=E4=BB=BB=E5=8A=A1=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ProdOrderNoteController.java | 76 ++++++ .../controller/ProdRouteController.java | 76 ++++++ .../ProdStationCapabilityController.java | 76 ++++++ .../controller/ProdTaskPoolController.java | 83 ++++++ .../controller/ProdTeamShiftController.java | 76 ++++++ .../production/domain/ProdOrderNote.java | 156 ++++++++++++ .../aucma/production/domain/ProdRoute.java | 157 ++++++++++++ .../production/domain/ProdRouteDetail.java | 141 +++++++++++ .../domain/ProdStationCapability.java | 205 +++++++++++++++ .../aucma/production/domain/ProdTaskPool.java | 237 ++++++++++++++++++ .../production/domain/ProdTeamShift.java | 190 ++++++++++++++ .../mapper/ProdOrderNoteMapper.java | 25 ++ .../production/mapper/ProdRouteMapper.java | 34 +++ .../mapper/ProdStationCapabilityMapper.java | 27 ++ .../production/mapper/ProdTaskPoolMapper.java | 25 ++ .../mapper/ProdTeamShiftMapper.java | 27 ++ .../service/IProdOrderNoteService.java | 17 ++ .../production/service/IProdRouteService.java | 17 ++ .../IProdStationCapabilityService.java | 17 ++ .../service/IProdTaskPoolService.java | 19 ++ .../service/IProdTeamShiftService.java | 17 ++ .../impl/ProdOrderNoteServiceImpl.java | 75 ++++++ .../service/impl/ProdRouteServiceImpl.java | 132 ++++++++++ .../ProdStationCapabilityServiceImpl.java | 72 ++++++ .../service/impl/ProdTaskPoolServiceImpl.java | 96 +++++++ .../impl/ProdTeamShiftServiceImpl.java | 74 ++++++ .../mapper/production/ProdOrderNoteMapper.xml | 95 +++++++ .../mapper/production/ProdRouteMapper.xml | 150 +++++++++++ .../ProdStationCapabilityMapper.xml | 115 +++++++++ .../mapper/production/ProdTaskPoolMapper.xml | 152 +++++++++++ .../mapper/production/ProdTeamShiftMapper.xml | 116 +++++++++ aucma-report/quality_trace_data.sql | 110 ++++++++ 32 files changed, 2885 insertions(+) create mode 100644 aucma-production/src/main/java/com/aucma/production/controller/ProdOrderNoteController.java create mode 100644 aucma-production/src/main/java/com/aucma/production/controller/ProdRouteController.java create mode 100644 aucma-production/src/main/java/com/aucma/production/controller/ProdStationCapabilityController.java create mode 100644 aucma-production/src/main/java/com/aucma/production/controller/ProdTaskPoolController.java create mode 100644 aucma-production/src/main/java/com/aucma/production/controller/ProdTeamShiftController.java create mode 100644 aucma-production/src/main/java/com/aucma/production/domain/ProdOrderNote.java create mode 100644 aucma-production/src/main/java/com/aucma/production/domain/ProdRoute.java create mode 100644 aucma-production/src/main/java/com/aucma/production/domain/ProdRouteDetail.java create mode 100644 aucma-production/src/main/java/com/aucma/production/domain/ProdStationCapability.java create mode 100644 aucma-production/src/main/java/com/aucma/production/domain/ProdTaskPool.java create mode 100644 aucma-production/src/main/java/com/aucma/production/domain/ProdTeamShift.java create mode 100644 aucma-production/src/main/java/com/aucma/production/mapper/ProdOrderNoteMapper.java create mode 100644 aucma-production/src/main/java/com/aucma/production/mapper/ProdRouteMapper.java create mode 100644 aucma-production/src/main/java/com/aucma/production/mapper/ProdStationCapabilityMapper.java create mode 100644 aucma-production/src/main/java/com/aucma/production/mapper/ProdTaskPoolMapper.java create mode 100644 aucma-production/src/main/java/com/aucma/production/mapper/ProdTeamShiftMapper.java create mode 100644 aucma-production/src/main/java/com/aucma/production/service/IProdOrderNoteService.java create mode 100644 aucma-production/src/main/java/com/aucma/production/service/IProdRouteService.java create mode 100644 aucma-production/src/main/java/com/aucma/production/service/IProdStationCapabilityService.java create mode 100644 aucma-production/src/main/java/com/aucma/production/service/IProdTaskPoolService.java create mode 100644 aucma-production/src/main/java/com/aucma/production/service/IProdTeamShiftService.java create mode 100644 aucma-production/src/main/java/com/aucma/production/service/impl/ProdOrderNoteServiceImpl.java create mode 100644 aucma-production/src/main/java/com/aucma/production/service/impl/ProdRouteServiceImpl.java create mode 100644 aucma-production/src/main/java/com/aucma/production/service/impl/ProdStationCapabilityServiceImpl.java create mode 100644 aucma-production/src/main/java/com/aucma/production/service/impl/ProdTaskPoolServiceImpl.java create mode 100644 aucma-production/src/main/java/com/aucma/production/service/impl/ProdTeamShiftServiceImpl.java create mode 100644 aucma-production/src/main/resources/mapper/production/ProdOrderNoteMapper.xml create mode 100644 aucma-production/src/main/resources/mapper/production/ProdRouteMapper.xml create mode 100644 aucma-production/src/main/resources/mapper/production/ProdStationCapabilityMapper.xml create mode 100644 aucma-production/src/main/resources/mapper/production/ProdTaskPoolMapper.xml create mode 100644 aucma-production/src/main/resources/mapper/production/ProdTeamShiftMapper.xml create mode 100644 aucma-report/quality_trace_data.sql diff --git a/aucma-production/src/main/java/com/aucma/production/controller/ProdOrderNoteController.java b/aucma-production/src/main/java/com/aucma/production/controller/ProdOrderNoteController.java new file mode 100644 index 0000000..108200d --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/controller/ProdOrderNoteController.java @@ -0,0 +1,76 @@ +package com.aucma.production.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.aucma.common.annotation.Log; +import com.aucma.common.core.controller.BaseController; +import com.aucma.common.core.domain.AjaxResult; +import com.aucma.common.enums.BusinessType; +import com.aucma.production.domain.ProdOrderNote; +import com.aucma.production.service.IProdOrderNoteService; +import com.aucma.common.utils.poi.ExcelUtil; +import com.aucma.common.core.page.TableDataInfo; + +@RestController +@RequestMapping("/production/orderNote") +public class ProdOrderNoteController extends BaseController { + @Autowired + private IProdOrderNoteService prodOrderNoteService; + + @PreAuthorize("@ss.hasPermi('production:orderNote:list')") + @GetMapping("/list") + public TableDataInfo list(ProdOrderNote prodOrderNote) { + startPage(); + List list = prodOrderNoteService.selectProdOrderNoteList(prodOrderNote); + return getDataTable(list); + } + + @PreAuthorize("@ss.hasPermi('production:orderNote:export')") + @Log(title = "工单备注与异常记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ProdOrderNote prodOrderNote) { + List list = prodOrderNoteService.selectProdOrderNoteList(prodOrderNote); + ExcelUtil util = new ExcelUtil(ProdOrderNote.class); + util.exportExcel(response, list, "工单备注与异常记录数据"); + } + + @PreAuthorize("@ss.hasPermi('production:orderNote:query')") + @GetMapping(value = "/{objId}") + public AjaxResult getInfo(@PathVariable("objId") Long objId) { + return success(prodOrderNoteService.selectProdOrderNoteByObjId(objId)); + } + + @PreAuthorize("@ss.hasPermi('production:orderNote:add')") + @Log(title = "工单备注与异常记录", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ProdOrderNote prodOrderNote) { + prodOrderNote.setCreatedBy(getUsername()); + return toAjax(prodOrderNoteService.insertProdOrderNote(prodOrderNote)); + } + + @PreAuthorize("@ss.hasPermi('production:orderNote:edit')") + @Log(title = "工单备注与异常记录", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ProdOrderNote prodOrderNote) { + prodOrderNote.setUpdatedBy(getUsername()); + return toAjax(prodOrderNoteService.updateProdOrderNote(prodOrderNote)); + } + + @PreAuthorize("@ss.hasPermi('production:orderNote:remove')") + @Log(title = "工单备注与异常记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{objIds}") + public AjaxResult remove(@PathVariable Long[] objIds) { + return toAjax(prodOrderNoteService.deleteProdOrderNoteByObjIds(objIds)); + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/controller/ProdRouteController.java b/aucma-production/src/main/java/com/aucma/production/controller/ProdRouteController.java new file mode 100644 index 0000000..66735e3 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/controller/ProdRouteController.java @@ -0,0 +1,76 @@ +package com.aucma.production.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.aucma.common.annotation.Log; +import com.aucma.common.core.controller.BaseController; +import com.aucma.common.core.domain.AjaxResult; +import com.aucma.common.enums.BusinessType; +import com.aucma.production.domain.ProdRoute; +import com.aucma.production.service.IProdRouteService; +import com.aucma.common.utils.poi.ExcelUtil; +import com.aucma.common.core.page.TableDataInfo; + +@RestController +@RequestMapping("/production/processRoute") +public class ProdRouteController extends BaseController { + @Autowired + private IProdRouteService prodRouteService; + + @PreAuthorize("@ss.hasPermi('production:processRoute:list')") + @GetMapping("/list") + public TableDataInfo list(ProdRoute prodRoute) { + startPage(); + List list = prodRouteService.selectProdRouteList(prodRoute); + return getDataTable(list); + } + + @PreAuthorize("@ss.hasPermi('production:processRoute:export')") + @Log(title = "生产工艺路线", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ProdRoute prodRoute) { + List list = prodRouteService.selectProdRouteList(prodRoute); + ExcelUtil util = new ExcelUtil(ProdRoute.class); + util.exportExcel(response, list, "生产工艺路线数据"); + } + + @PreAuthorize("@ss.hasPermi('production:processRoute:query')") + @GetMapping(value = "/{objId}") + public AjaxResult getInfo(@PathVariable("objId") Long objId) { + return success(prodRouteService.selectProdRouteByObjId(objId)); + } + + @PreAuthorize("@ss.hasPermi('production:processRoute:add')") + @Log(title = "生产工艺路线", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ProdRoute prodRoute) { + prodRoute.setCreatedBy(getUsername()); + return toAjax(prodRouteService.insertProdRoute(prodRoute)); + } + + @PreAuthorize("@ss.hasPermi('production:processRoute:edit')") + @Log(title = "生产工艺路线", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ProdRoute prodRoute) { + prodRoute.setUpdatedBy(getUsername()); + return toAjax(prodRouteService.updateProdRoute(prodRoute)); + } + + @PreAuthorize("@ss.hasPermi('production:processRoute:remove')") + @Log(title = "生产工艺路线", businessType = BusinessType.DELETE) + @DeleteMapping("/{objIds}") + public AjaxResult remove(@PathVariable Long[] objIds) { + return toAjax(prodRouteService.deleteProdRouteByObjIds(objIds)); + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/controller/ProdStationCapabilityController.java b/aucma-production/src/main/java/com/aucma/production/controller/ProdStationCapabilityController.java new file mode 100644 index 0000000..6f07c36 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/controller/ProdStationCapabilityController.java @@ -0,0 +1,76 @@ +package com.aucma.production.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.aucma.common.annotation.Log; +import com.aucma.common.core.controller.BaseController; +import com.aucma.common.core.domain.AjaxResult; +import com.aucma.common.enums.BusinessType; +import com.aucma.production.domain.ProdStationCapability; +import com.aucma.production.service.IProdStationCapabilityService; +import com.aucma.common.utils.poi.ExcelUtil; +import com.aucma.common.core.page.TableDataInfo; + +@RestController +@RequestMapping("/production/stationCapability") +public class ProdStationCapabilityController extends BaseController { + @Autowired + private IProdStationCapabilityService prodStationCapabilityService; + + @PreAuthorize("@ss.hasPermi('production:stationCapability:list')") + @GetMapping("/list") + public TableDataInfo list(ProdStationCapability prodStationCapability) { + startPage(); + List list = prodStationCapabilityService.selectProdStationCapabilityList(prodStationCapability); + return getDataTable(list); + } + + @PreAuthorize("@ss.hasPermi('production:stationCapability:export')") + @Log(title = "工位能力维护", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ProdStationCapability prodStationCapability) { + List list = prodStationCapabilityService.selectProdStationCapabilityList(prodStationCapability); + ExcelUtil util = new ExcelUtil(ProdStationCapability.class); + util.exportExcel(response, list, "工位能力维护数据"); + } + + @PreAuthorize("@ss.hasPermi('production:stationCapability:query')") + @GetMapping(value = "/{objId}") + public AjaxResult getInfo(@PathVariable("objId") Long objId) { + return success(prodStationCapabilityService.selectProdStationCapabilityByObjId(objId)); + } + + @PreAuthorize("@ss.hasPermi('production:stationCapability:add')") + @Log(title = "工位能力维护", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ProdStationCapability prodStationCapability) { + prodStationCapability.setCreatedBy(getUsername()); + return toAjax(prodStationCapabilityService.insertProdStationCapability(prodStationCapability)); + } + + @PreAuthorize("@ss.hasPermi('production:stationCapability:edit')") + @Log(title = "工位能力维护", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ProdStationCapability prodStationCapability) { + prodStationCapability.setUpdatedBy(getUsername()); + return toAjax(prodStationCapabilityService.updateProdStationCapability(prodStationCapability)); + } + + @PreAuthorize("@ss.hasPermi('production:stationCapability:remove')") + @Log(title = "工位能力维护", businessType = BusinessType.DELETE) + @DeleteMapping("/{objIds}") + public AjaxResult remove(@PathVariable Long[] objIds) { + return toAjax(prodStationCapabilityService.deleteProdStationCapabilityByObjIds(objIds)); + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/controller/ProdTaskPoolController.java b/aucma-production/src/main/java/com/aucma/production/controller/ProdTaskPoolController.java new file mode 100644 index 0000000..021bd97 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/controller/ProdTaskPoolController.java @@ -0,0 +1,83 @@ +package com.aucma.production.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.aucma.common.annotation.Log; +import com.aucma.common.core.controller.BaseController; +import com.aucma.common.core.domain.AjaxResult; +import com.aucma.common.enums.BusinessType; +import com.aucma.production.domain.ProdTaskPool; +import com.aucma.production.service.IProdTaskPoolService; +import com.aucma.common.utils.poi.ExcelUtil; +import com.aucma.common.core.page.TableDataInfo; + +@RestController +@RequestMapping("/production/taskPool") +public class ProdTaskPoolController extends BaseController { + @Autowired + private IProdTaskPoolService prodTaskPoolService; + + @PreAuthorize("@ss.hasPermi('production:taskPool:list')") + @GetMapping("/list") + public TableDataInfo list(ProdTaskPool prodTaskPool) { + startPage(); + List list = prodTaskPoolService.selectProdTaskPoolList(prodTaskPool); + return getDataTable(list); + } + + @PreAuthorize("@ss.hasPermi('production:taskPool:export')") + @Log(title = "生产任务池", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ProdTaskPool prodTaskPool) { + List list = prodTaskPoolService.selectProdTaskPoolList(prodTaskPool); + ExcelUtil util = new ExcelUtil(ProdTaskPool.class); + util.exportExcel(response, list, "生产任务池数据"); + } + + @PreAuthorize("@ss.hasPermi('production:taskPool:query')") + @GetMapping(value = "/{orderCode}") + public AjaxResult getInfo(@PathVariable("orderCode") String orderCode) { + return success(prodTaskPoolService.selectProdTaskPoolByOrderCode(orderCode)); + } + + @PreAuthorize("@ss.hasPermi('production:taskPool:add')") + @Log(title = "生产任务池", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ProdTaskPool prodTaskPool) { + prodTaskPool.setCreatedBy(getUsername()); + return toAjax(prodTaskPoolService.insertProdTaskPool(prodTaskPool)); + } + + @PreAuthorize("@ss.hasPermi('production:taskPool:edit')") + @Log(title = "生产任务池", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ProdTaskPool prodTaskPool) { + prodTaskPool.setUpdatedBy(getUsername()); + return toAjax(prodTaskPoolService.updateProdTaskPool(prodTaskPool)); + } + + @PreAuthorize("@ss.hasPermi('production:taskPool:edit')") + @Log(title = "生产任务池状态切换", businessType = BusinessType.UPDATE) + @PutMapping("/changeStatus") + public AjaxResult changeStatus(@RequestBody ProdTaskPool prodTaskPool) { + return toAjax(prodTaskPoolService.changeTaskStatus(prodTaskPool)); + } + + @PreAuthorize("@ss.hasPermi('production:taskPool:remove')") + @Log(title = "生产任务池", businessType = BusinessType.DELETE) + @DeleteMapping("/{orderCodes}") + public AjaxResult remove(@PathVariable String[] orderCodes) { + return toAjax(prodTaskPoolService.deleteProdTaskPoolByOrderCodes(orderCodes)); + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/controller/ProdTeamShiftController.java b/aucma-production/src/main/java/com/aucma/production/controller/ProdTeamShiftController.java new file mode 100644 index 0000000..2c7443e --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/controller/ProdTeamShiftController.java @@ -0,0 +1,76 @@ +package com.aucma.production.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.aucma.common.annotation.Log; +import com.aucma.common.core.controller.BaseController; +import com.aucma.common.core.domain.AjaxResult; +import com.aucma.common.enums.BusinessType; +import com.aucma.production.domain.ProdTeamShift; +import com.aucma.production.service.IProdTeamShiftService; +import com.aucma.common.utils.poi.ExcelUtil; +import com.aucma.common.core.page.TableDataInfo; + +@RestController +@RequestMapping("/production/teamShift") +public class ProdTeamShiftController extends BaseController { + @Autowired + private IProdTeamShiftService prodTeamShiftService; + + @PreAuthorize("@ss.hasPermi('production:teamShift:list')") + @GetMapping("/list") + public TableDataInfo list(ProdTeamShift prodTeamShift) { + startPage(); + List list = prodTeamShiftService.selectProdTeamShiftList(prodTeamShift); + return getDataTable(list); + } + + @PreAuthorize("@ss.hasPermi('production:teamShift:export')") + @Log(title = "班组排班维护", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, ProdTeamShift prodTeamShift) { + List list = prodTeamShiftService.selectProdTeamShiftList(prodTeamShift); + ExcelUtil util = new ExcelUtil(ProdTeamShift.class); + util.exportExcel(response, list, "班组排班维护数据"); + } + + @PreAuthorize("@ss.hasPermi('production:teamShift:query')") + @GetMapping(value = "/{objId}") + public AjaxResult getInfo(@PathVariable("objId") Long objId) { + return success(prodTeamShiftService.selectProdTeamShiftByObjId(objId)); + } + + @PreAuthorize("@ss.hasPermi('production:teamShift:add')") + @Log(title = "班组排班维护", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody ProdTeamShift prodTeamShift) { + prodTeamShift.setCreatedBy(getUsername()); + return toAjax(prodTeamShiftService.insertProdTeamShift(prodTeamShift)); + } + + @PreAuthorize("@ss.hasPermi('production:teamShift:edit')") + @Log(title = "班组排班维护", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody ProdTeamShift prodTeamShift) { + prodTeamShift.setUpdatedBy(getUsername()); + return toAjax(prodTeamShiftService.updateProdTeamShift(prodTeamShift)); + } + + @PreAuthorize("@ss.hasPermi('production:teamShift:remove')") + @Log(title = "班组排班维护", businessType = BusinessType.DELETE) + @DeleteMapping("/{objIds}") + public AjaxResult remove(@PathVariable Long[] objIds) { + return toAjax(prodTeamShiftService.deleteProdTeamShiftByObjIds(objIds)); + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/domain/ProdOrderNote.java b/aucma-production/src/main/java/com/aucma/production/domain/ProdOrderNote.java new file mode 100644 index 0000000..5b5dc3b --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/domain/ProdOrderNote.java @@ -0,0 +1,156 @@ +package com.aucma.production.domain; + +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.aucma.common.annotation.Excel; +import com.aucma.common.core.domain.BaseEntity; + +/** + * 工单备注与异常记录对象 prod_order_note + * + * @author Codex + * @date 2026-03-18 + */ +public class ProdOrderNote extends BaseEntity { + private static final long serialVersionUID = 1L; + + private Long objId; + @Excel(name = "工单编号") + private String orderCode; + @Excel(name = "物料编码") + private String materialCode; + @Excel(name = "物料名称") + private String materialName; + @Excel(name = "工单状态") + private String executionStatus; + @Excel(name = "记录类型") + private String noteType; + @Excel(name = "记录内容") + private String noteContent; + @Excel(name = "状态") + private String status; + @Excel(name = "创建人") + private String createdBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date createdTime; + @Excel(name = "更新人") + private String updatedBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date updatedTime; + + public Long getObjId() { + return objId; + } + + public void setObjId(Long objId) { + this.objId = objId; + } + + public String getOrderCode() { + return orderCode; + } + + public void setOrderCode(String orderCode) { + this.orderCode = orderCode; + } + + public String getMaterialCode() { + return materialCode; + } + + public void setMaterialCode(String materialCode) { + this.materialCode = materialCode; + } + + public String getMaterialName() { + return materialName; + } + + public void setMaterialName(String materialName) { + this.materialName = materialName; + } + + public String getExecutionStatus() { + return executionStatus; + } + + public void setExecutionStatus(String executionStatus) { + this.executionStatus = executionStatus; + } + + public String getNoteType() { + return noteType; + } + + public void setNoteType(String noteType) { + this.noteType = noteType; + } + + public String getNoteContent() { + return noteContent; + } + + public void setNoteContent(String noteContent) { + this.noteContent = noteContent; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("objId", getObjId()) + .append("orderCode", getOrderCode()) + .append("materialCode", getMaterialCode()) + .append("materialName", getMaterialName()) + .append("executionStatus", getExecutionStatus()) + .append("noteType", getNoteType()) + .append("noteContent", getNoteContent()) + .append("status", getStatus()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/domain/ProdRoute.java b/aucma-production/src/main/java/com/aucma/production/domain/ProdRoute.java new file mode 100644 index 0000000..a92a995 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/domain/ProdRoute.java @@ -0,0 +1,157 @@ +package com.aucma.production.domain; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.aucma.common.annotation.Excel; +import com.aucma.common.core.domain.BaseEntity; + +/** + * 生产工艺路线对象 prod_route + * + * @author Codex + * @date 2026-03-18 + */ +public class ProdRoute extends BaseEntity { + private static final long serialVersionUID = 1L; + + private Long objId; + @Excel(name = "路线编码") + private String routeCode; + @Excel(name = "路线名称") + private String routeName; + @Excel(name = "物料编码") + private String materialCode; + @Excel(name = "物料名称") + private String materialName; + @Excel(name = "版本号") + private String versionNo; + @Excel(name = "状态") + private String status; + @Excel(name = "创建人") + private String createdBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date createdTime; + @Excel(name = "更新人") + private String updatedBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date updatedTime; + private List detailList = new ArrayList(); + + public Long getObjId() { + return objId; + } + + public void setObjId(Long objId) { + this.objId = objId; + } + + public String getRouteCode() { + return routeCode; + } + + public void setRouteCode(String routeCode) { + this.routeCode = routeCode; + } + + public String getRouteName() { + return routeName; + } + + public void setRouteName(String routeName) { + this.routeName = routeName; + } + + public String getMaterialCode() { + return materialCode; + } + + public void setMaterialCode(String materialCode) { + this.materialCode = materialCode; + } + + public String getMaterialName() { + return materialName; + } + + public void setMaterialName(String materialName) { + this.materialName = materialName; + } + + public String getVersionNo() { + return versionNo; + } + + public void setVersionNo(String versionNo) { + this.versionNo = versionNo; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + public List getDetailList() { + return detailList; + } + + public void setDetailList(List detailList) { + this.detailList = detailList; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("objId", getObjId()) + .append("routeCode", getRouteCode()) + .append("routeName", getRouteName()) + .append("materialCode", getMaterialCode()) + .append("materialName", getMaterialName()) + .append("versionNo", getVersionNo()) + .append("status", getStatus()) + .append("remark", getRemark()) + .append("detailList", getDetailList()) + .toString(); + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/domain/ProdRouteDetail.java b/aucma-production/src/main/java/com/aucma/production/domain/ProdRouteDetail.java new file mode 100644 index 0000000..20e0530 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/domain/ProdRouteDetail.java @@ -0,0 +1,141 @@ +package com.aucma.production.domain; + +import java.math.BigDecimal; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.aucma.common.annotation.Excel; +import com.aucma.common.core.domain.BaseEntity; + +/** + * 工艺路线明细对象 prod_route_dtl + * + * @author Codex + * @date 2026-03-18 + */ +public class ProdRouteDetail extends BaseEntity { + private static final long serialVersionUID = 1L; + + private Long objId; + private String routeCode; + @Excel(name = "工序编码") + private String processCode; + @Excel(name = "工序名称") + private String processName; + @Excel(name = "顺序号") + private Long sortNo; + @Excel(name = "是否必经") + private String requiredFlag; + @Excel(name = "标准工时") + private BigDecimal standardWorkTime; + private String createdBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createdTime; + private String updatedBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updatedTime; + + public Long getObjId() { + return objId; + } + + public void setObjId(Long objId) { + this.objId = objId; + } + + public String getRouteCode() { + return routeCode; + } + + public void setRouteCode(String routeCode) { + this.routeCode = routeCode; + } + + public String getProcessCode() { + return processCode; + } + + public void setProcessCode(String processCode) { + this.processCode = processCode; + } + + public String getProcessName() { + return processName; + } + + public void setProcessName(String processName) { + this.processName = processName; + } + + public Long getSortNo() { + return sortNo; + } + + public void setSortNo(Long sortNo) { + this.sortNo = sortNo; + } + + public String getRequiredFlag() { + return requiredFlag; + } + + public void setRequiredFlag(String requiredFlag) { + this.requiredFlag = requiredFlag; + } + + public BigDecimal getStandardWorkTime() { + return standardWorkTime; + } + + public void setStandardWorkTime(BigDecimal standardWorkTime) { + this.standardWorkTime = standardWorkTime; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("objId", getObjId()) + .append("routeCode", getRouteCode()) + .append("processCode", getProcessCode()) + .append("processName", getProcessName()) + .append("sortNo", getSortNo()) + .append("requiredFlag", getRequiredFlag()) + .append("standardWorkTime", getStandardWorkTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/domain/ProdStationCapability.java b/aucma-production/src/main/java/com/aucma/production/domain/ProdStationCapability.java new file mode 100644 index 0000000..5f1b8be --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/domain/ProdStationCapability.java @@ -0,0 +1,205 @@ +package com.aucma.production.domain; + +import java.math.BigDecimal; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.aucma.common.annotation.Excel; +import com.aucma.common.core.domain.BaseEntity; + +/** + * 工位能力维护对象 prod_sta_cap + * + * @author Codex + * @date 2026-03-18 + */ +public class ProdStationCapability extends BaseEntity { + private static final long serialVersionUID = 1L; + + private Long objId; + @Excel(name = "工位编码") + private String stationCode; + @Excel(name = "工位名称") + private String stationName; + @Excel(name = "物料编码") + private String materialCode; + @Excel(name = "物料名称") + private String materialName; + @Excel(name = "标准节拍") + private BigDecimal standardCt; + @Excel(name = "班产能") + private BigDecimal shiftCap; + @Excel(name = "日产能") + private BigDecimal dayCap; + @Excel(name = "切换时长(分钟)") + private Long changeoverMin; + @Excel(name = "责任班组") + private String teamCode; + @Excel(name = "班组名称") + private String teamName; + @Excel(name = "状态") + private String status; + @Excel(name = "创建人") + private String createdBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date createdTime; + @Excel(name = "更新人") + private String updatedBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date updatedTime; + + public Long getObjId() { + return objId; + } + + public void setObjId(Long objId) { + this.objId = objId; + } + + public String getStationCode() { + return stationCode; + } + + public void setStationCode(String stationCode) { + this.stationCode = stationCode; + } + + public String getStationName() { + return stationName; + } + + public void setStationName(String stationName) { + this.stationName = stationName; + } + + public String getMaterialCode() { + return materialCode; + } + + public void setMaterialCode(String materialCode) { + this.materialCode = materialCode; + } + + public String getMaterialName() { + return materialName; + } + + public void setMaterialName(String materialName) { + this.materialName = materialName; + } + + public BigDecimal getStandardCt() { + return standardCt; + } + + public void setStandardCt(BigDecimal standardCt) { + this.standardCt = standardCt; + } + + public BigDecimal getShiftCap() { + return shiftCap; + } + + public void setShiftCap(BigDecimal shiftCap) { + this.shiftCap = shiftCap; + } + + public BigDecimal getDayCap() { + return dayCap; + } + + public void setDayCap(BigDecimal dayCap) { + this.dayCap = dayCap; + } + + public Long getChangeoverMin() { + return changeoverMin; + } + + public void setChangeoverMin(Long changeoverMin) { + this.changeoverMin = changeoverMin; + } + + public String getTeamCode() { + return teamCode; + } + + public void setTeamCode(String teamCode) { + this.teamCode = teamCode; + } + + public String getTeamName() { + return teamName; + } + + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("objId", getObjId()) + .append("stationCode", getStationCode()) + .append("stationName", getStationName()) + .append("materialCode", getMaterialCode()) + .append("materialName", getMaterialName()) + .append("standardCt", getStandardCt()) + .append("shiftCap", getShiftCap()) + .append("dayCap", getDayCap()) + .append("changeoverMin", getChangeoverMin()) + .append("teamCode", getTeamCode()) + .append("teamName", getTeamName()) + .append("status", getStatus()) + .append("remark", getRemark()) + .append("createdBy", getCreatedBy()) + .append("createdTime", getCreatedTime()) + .append("updatedBy", getUpdatedBy()) + .append("updatedTime", getUpdatedTime()) + .toString(); + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/domain/ProdTaskPool.java b/aucma-production/src/main/java/com/aucma/production/domain/ProdTaskPool.java new file mode 100644 index 0000000..bc67c0d --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/domain/ProdTaskPool.java @@ -0,0 +1,237 @@ +package com.aucma.production.domain; + +import java.math.BigDecimal; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.aucma.common.annotation.Excel; +import com.aucma.common.core.domain.BaseEntity; + +/** + * 生产任务池对象 prod_task_pool + * + * @author Codex + * @date 2026-03-18 + */ +public class ProdTaskPool extends BaseEntity { + private static final long serialVersionUID = 1L; + + private Long objId; + @Excel(name = "工单编号") + private String orderCode; + @Excel(name = "物料编码") + private String materialCode; + @Excel(name = "物料名称") + private String materialName; + @Excel(name = "计划数量") + private BigDecimal orderAmount; + @Excel(name = "已完工数量") + private Long completeAmount; + @Excel(name = "执行状态") + private String executionStatus; + @Excel(name = "任务分组") + private String taskBucket; + @Excel(name = "负责人") + private Long ownerUserId; + @Excel(name = "负责人姓名") + private String ownerUserName; + @Excel(name = "优先级") + private String priorityLevel; + @Excel(name = "设备编码") + private String deviceCode; + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "计划结束日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date endDate; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "开始生产时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "完工时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date finishTime; + @Excel(name = "创建人") + private String createdBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date createdTime; + @Excel(name = "更新人") + private String updatedBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date updatedTime; + + public Long getObjId() { + return objId; + } + + public void setObjId(Long objId) { + this.objId = objId; + } + + public String getOrderCode() { + return orderCode; + } + + public void setOrderCode(String orderCode) { + this.orderCode = orderCode; + } + + public String getMaterialCode() { + return materialCode; + } + + public void setMaterialCode(String materialCode) { + this.materialCode = materialCode; + } + + public String getMaterialName() { + return materialName; + } + + public void setMaterialName(String materialName) { + this.materialName = materialName; + } + + public BigDecimal getOrderAmount() { + return orderAmount; + } + + public void setOrderAmount(BigDecimal orderAmount) { + this.orderAmount = orderAmount; + } + + public Long getCompleteAmount() { + return completeAmount; + } + + public void setCompleteAmount(Long completeAmount) { + this.completeAmount = completeAmount; + } + + public String getExecutionStatus() { + return executionStatus; + } + + public void setExecutionStatus(String executionStatus) { + this.executionStatus = executionStatus; + } + + public String getTaskBucket() { + return taskBucket; + } + + public void setTaskBucket(String taskBucket) { + this.taskBucket = taskBucket; + } + + public Long getOwnerUserId() { + return ownerUserId; + } + + public void setOwnerUserId(Long ownerUserId) { + this.ownerUserId = ownerUserId; + } + + public String getOwnerUserName() { + return ownerUserName; + } + + public void setOwnerUserName(String ownerUserName) { + this.ownerUserName = ownerUserName; + } + + public String getPriorityLevel() { + return priorityLevel; + } + + public void setPriorityLevel(String priorityLevel) { + this.priorityLevel = priorityLevel; + } + + public String getDeviceCode() { + return deviceCode; + } + + public void setDeviceCode(String deviceCode) { + this.deviceCode = deviceCode; + } + + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getFinishTime() { + return finishTime; + } + + public void setFinishTime(Date finishTime) { + this.finishTime = finishTime; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("objId", getObjId()) + .append("orderCode", getOrderCode()) + .append("materialCode", getMaterialCode()) + .append("materialName", getMaterialName()) + .append("orderAmount", getOrderAmount()) + .append("completeAmount", getCompleteAmount()) + .append("executionStatus", getExecutionStatus()) + .append("taskBucket", getTaskBucket()) + .append("ownerUserId", getOwnerUserId()) + .append("ownerUserName", getOwnerUserName()) + .append("priorityLevel", getPriorityLevel()) + .append("deviceCode", getDeviceCode()) + .append("endDate", getEndDate()) + .append("startTime", getStartTime()) + .append("finishTime", getFinishTime()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/domain/ProdTeamShift.java b/aucma-production/src/main/java/com/aucma/production/domain/ProdTeamShift.java new file mode 100644 index 0000000..0bd8399 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/domain/ProdTeamShift.java @@ -0,0 +1,190 @@ +package com.aucma.production.domain; + +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.aucma.common.annotation.Excel; +import com.aucma.common.core.domain.BaseEntity; + +/** + * 班组排班维护对象 prod_team_sch + * + * @author Codex + * @date 2026-03-18 + */ +public class ProdTeamShift extends BaseEntity { + private static final long serialVersionUID = 1L; + + private Long objId; + @Excel(name = "班组编码") + private String teamCode; + @Excel(name = "班组名称") + private String teamName; + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "排班日期", width = 30, dateFormat = "yyyy-MM-dd") + private Date shiftDate; + @Excel(name = "班次编码") + private String shiftCode; + @Excel(name = "负责人") + private Long leaderUserId; + @Excel(name = "负责人姓名") + private String leaderUserName; + @Excel(name = "责任产线") + private String lineCode; + @Excel(name = "产线名称") + private String lineName; + @Excel(name = "责任区域") + private String areaDesc; + @Excel(name = "状态") + private String status; + @Excel(name = "创建人") + private String createdBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date createdTime; + @Excel(name = "更新人") + private String updatedBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "更新时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date updatedTime; + + public Long getObjId() { + return objId; + } + + public void setObjId(Long objId) { + this.objId = objId; + } + + public String getTeamCode() { + return teamCode; + } + + public void setTeamCode(String teamCode) { + this.teamCode = teamCode; + } + + public String getTeamName() { + return teamName; + } + + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + public Date getShiftDate() { + return shiftDate; + } + + public void setShiftDate(Date shiftDate) { + this.shiftDate = shiftDate; + } + + public String getShiftCode() { + return shiftCode; + } + + public void setShiftCode(String shiftCode) { + this.shiftCode = shiftCode; + } + + public Long getLeaderUserId() { + return leaderUserId; + } + + public void setLeaderUserId(Long leaderUserId) { + this.leaderUserId = leaderUserId; + } + + public String getLeaderUserName() { + return leaderUserName; + } + + public void setLeaderUserName(String leaderUserName) { + this.leaderUserName = leaderUserName; + } + + public String getLineCode() { + return lineCode; + } + + public void setLineCode(String lineCode) { + this.lineCode = lineCode; + } + + public String getLineName() { + return lineName; + } + + public void setLineName(String lineName) { + this.lineName = lineName; + } + + public String getAreaDesc() { + return areaDesc; + } + + public void setAreaDesc(String areaDesc) { + this.areaDesc = areaDesc; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getCreatedBy() { + return createdBy; + } + + public void setCreatedBy(String createdBy) { + this.createdBy = createdBy; + } + + public Date getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public void setUpdatedBy(String updatedBy) { + this.updatedBy = updatedBy; + } + + public Date getUpdatedTime() { + return updatedTime; + } + + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("objId", getObjId()) + .append("teamCode", getTeamCode()) + .append("teamName", getTeamName()) + .append("shiftDate", getShiftDate()) + .append("shiftCode", getShiftCode()) + .append("leaderUserId", getLeaderUserId()) + .append("leaderUserName", getLeaderUserName()) + .append("lineCode", getLineCode()) + .append("lineName", getLineName()) + .append("areaDesc", getAreaDesc()) + .append("status", getStatus()) + .append("remark", getRemark()) + .toString(); + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/mapper/ProdOrderNoteMapper.java b/aucma-production/src/main/java/com/aucma/production/mapper/ProdOrderNoteMapper.java new file mode 100644 index 0000000..5f29c10 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/mapper/ProdOrderNoteMapper.java @@ -0,0 +1,25 @@ +package com.aucma.production.mapper; + +import java.util.List; + +import com.aucma.production.domain.ProdOrderNote; + +/** + * 工单备注与异常记录Mapper接口 + * + * @author Codex + * @date 2026-03-18 + */ +public interface ProdOrderNoteMapper { + ProdOrderNote selectProdOrderNoteByObjId(Long objId); + + List selectProdOrderNoteList(ProdOrderNote prodOrderNote); + + int insertProdOrderNote(ProdOrderNote prodOrderNote); + + int updateProdOrderNote(ProdOrderNote prodOrderNote); + + int deleteProdOrderNoteByObjId(Long objId); + + int deleteProdOrderNoteByObjIds(Long[] objIds); +} diff --git a/aucma-production/src/main/java/com/aucma/production/mapper/ProdRouteMapper.java b/aucma-production/src/main/java/com/aucma/production/mapper/ProdRouteMapper.java new file mode 100644 index 0000000..3bc2a18 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/mapper/ProdRouteMapper.java @@ -0,0 +1,34 @@ +package com.aucma.production.mapper; + +import java.util.List; + +import com.aucma.production.domain.ProdRoute; +import com.aucma.production.domain.ProdRouteDetail; + +/** + * 生产工艺路线Mapper接口 + * + * @author Codex + * @date 2026-03-18 + */ +public interface ProdRouteMapper { + ProdRoute selectProdRouteByObjId(Long objId); + + ProdRoute selectProdRouteByRouteCode(String routeCode); + + List selectProdRouteList(ProdRoute prodRoute); + + List selectProdRouteDetailListByRouteCode(String routeCode); + + int insertProdRoute(ProdRoute prodRoute); + + int updateProdRoute(ProdRoute prodRoute); + + int deleteProdRouteByObjId(Long objId); + + int deleteProdRouteByObjIds(Long[] objIds); + + int insertProdRouteDetail(ProdRouteDetail detail); + + int deleteProdRouteDetailByRouteCode(String routeCode); +} diff --git a/aucma-production/src/main/java/com/aucma/production/mapper/ProdStationCapabilityMapper.java b/aucma-production/src/main/java/com/aucma/production/mapper/ProdStationCapabilityMapper.java new file mode 100644 index 0000000..d568add --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/mapper/ProdStationCapabilityMapper.java @@ -0,0 +1,27 @@ +package com.aucma.production.mapper; + +import java.util.List; + +import com.aucma.production.domain.ProdStationCapability; + +/** + * 工位能力维护Mapper接口 + * + * @author Codex + * @date 2026-03-18 + */ +public interface ProdStationCapabilityMapper { + ProdStationCapability selectProdStationCapabilityByObjId(Long objId); + + List selectProdStationCapabilityList(ProdStationCapability prodStationCapability); + + ProdStationCapability selectByStationCodeAndMaterialCode(ProdStationCapability prodStationCapability); + + int insertProdStationCapability(ProdStationCapability prodStationCapability); + + int updateProdStationCapability(ProdStationCapability prodStationCapability); + + int deleteProdStationCapabilityByObjId(Long objId); + + int deleteProdStationCapabilityByObjIds(Long[] objIds); +} diff --git a/aucma-production/src/main/java/com/aucma/production/mapper/ProdTaskPoolMapper.java b/aucma-production/src/main/java/com/aucma/production/mapper/ProdTaskPoolMapper.java new file mode 100644 index 0000000..efbbb10 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/mapper/ProdTaskPoolMapper.java @@ -0,0 +1,25 @@ +package com.aucma.production.mapper; + +import java.util.List; + +import com.aucma.production.domain.ProdTaskPool; + +/** + * 生产任务池Mapper接口 + * + * @author Codex + * @date 2026-03-18 + */ +public interface ProdTaskPoolMapper { + ProdTaskPool selectProdTaskPoolByOrderCode(String orderCode); + + List selectProdTaskPoolList(ProdTaskPool prodTaskPool); + + int insertProdTaskPool(ProdTaskPool prodTaskPool); + + int updateProdTaskPool(ProdTaskPool prodTaskPool); + + int deleteProdTaskPoolByOrderCodes(String[] orderCodes); + + int updateOrderExecutionStatus(ProdTaskPool prodTaskPool); +} diff --git a/aucma-production/src/main/java/com/aucma/production/mapper/ProdTeamShiftMapper.java b/aucma-production/src/main/java/com/aucma/production/mapper/ProdTeamShiftMapper.java new file mode 100644 index 0000000..0ae4454 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/mapper/ProdTeamShiftMapper.java @@ -0,0 +1,27 @@ +package com.aucma.production.mapper; + +import java.util.List; + +import com.aucma.production.domain.ProdTeamShift; + +/** + * 班组排班维护Mapper接口 + * + * @author Codex + * @date 2026-03-18 + */ +public interface ProdTeamShiftMapper { + ProdTeamShift selectProdTeamShiftByObjId(Long objId); + + List selectProdTeamShiftList(ProdTeamShift prodTeamShift); + + ProdTeamShift selectUniqueShift(ProdTeamShift prodTeamShift); + + int insertProdTeamShift(ProdTeamShift prodTeamShift); + + int updateProdTeamShift(ProdTeamShift prodTeamShift); + + int deleteProdTeamShiftByObjId(Long objId); + + int deleteProdTeamShiftByObjIds(Long[] objIds); +} diff --git a/aucma-production/src/main/java/com/aucma/production/service/IProdOrderNoteService.java b/aucma-production/src/main/java/com/aucma/production/service/IProdOrderNoteService.java new file mode 100644 index 0000000..0688782 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/service/IProdOrderNoteService.java @@ -0,0 +1,17 @@ +package com.aucma.production.service; + +import java.util.List; + +import com.aucma.production.domain.ProdOrderNote; + +public interface IProdOrderNoteService { + ProdOrderNote selectProdOrderNoteByObjId(Long objId); + + List selectProdOrderNoteList(ProdOrderNote prodOrderNote); + + int insertProdOrderNote(ProdOrderNote prodOrderNote); + + int updateProdOrderNote(ProdOrderNote prodOrderNote); + + int deleteProdOrderNoteByObjIds(Long[] objIds); +} diff --git a/aucma-production/src/main/java/com/aucma/production/service/IProdRouteService.java b/aucma-production/src/main/java/com/aucma/production/service/IProdRouteService.java new file mode 100644 index 0000000..45128f5 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/service/IProdRouteService.java @@ -0,0 +1,17 @@ +package com.aucma.production.service; + +import java.util.List; + +import com.aucma.production.domain.ProdRoute; + +public interface IProdRouteService { + ProdRoute selectProdRouteByObjId(Long objId); + + List selectProdRouteList(ProdRoute prodRoute); + + int insertProdRoute(ProdRoute prodRoute); + + int updateProdRoute(ProdRoute prodRoute); + + int deleteProdRouteByObjIds(Long[] objIds); +} diff --git a/aucma-production/src/main/java/com/aucma/production/service/IProdStationCapabilityService.java b/aucma-production/src/main/java/com/aucma/production/service/IProdStationCapabilityService.java new file mode 100644 index 0000000..94d9347 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/service/IProdStationCapabilityService.java @@ -0,0 +1,17 @@ +package com.aucma.production.service; + +import java.util.List; + +import com.aucma.production.domain.ProdStationCapability; + +public interface IProdStationCapabilityService { + ProdStationCapability selectProdStationCapabilityByObjId(Long objId); + + List selectProdStationCapabilityList(ProdStationCapability prodStationCapability); + + int insertProdStationCapability(ProdStationCapability prodStationCapability); + + int updateProdStationCapability(ProdStationCapability prodStationCapability); + + int deleteProdStationCapabilityByObjIds(Long[] objIds); +} diff --git a/aucma-production/src/main/java/com/aucma/production/service/IProdTaskPoolService.java b/aucma-production/src/main/java/com/aucma/production/service/IProdTaskPoolService.java new file mode 100644 index 0000000..3625737 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/service/IProdTaskPoolService.java @@ -0,0 +1,19 @@ +package com.aucma.production.service; + +import java.util.List; + +import com.aucma.production.domain.ProdTaskPool; + +public interface IProdTaskPoolService { + ProdTaskPool selectProdTaskPoolByOrderCode(String orderCode); + + List selectProdTaskPoolList(ProdTaskPool prodTaskPool); + + int insertProdTaskPool(ProdTaskPool prodTaskPool); + + int updateProdTaskPool(ProdTaskPool prodTaskPool); + + int deleteProdTaskPoolByOrderCodes(String[] orderCodes); + + int changeTaskStatus(ProdTaskPool prodTaskPool); +} diff --git a/aucma-production/src/main/java/com/aucma/production/service/IProdTeamShiftService.java b/aucma-production/src/main/java/com/aucma/production/service/IProdTeamShiftService.java new file mode 100644 index 0000000..077a685 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/service/IProdTeamShiftService.java @@ -0,0 +1,17 @@ +package com.aucma.production.service; + +import java.util.List; + +import com.aucma.production.domain.ProdTeamShift; + +public interface IProdTeamShiftService { + ProdTeamShift selectProdTeamShiftByObjId(Long objId); + + List selectProdTeamShiftList(ProdTeamShift prodTeamShift); + + int insertProdTeamShift(ProdTeamShift prodTeamShift); + + int updateProdTeamShift(ProdTeamShift prodTeamShift); + + int deleteProdTeamShiftByObjIds(Long[] objIds); +} diff --git a/aucma-production/src/main/java/com/aucma/production/service/impl/ProdOrderNoteServiceImpl.java b/aucma-production/src/main/java/com/aucma/production/service/impl/ProdOrderNoteServiceImpl.java new file mode 100644 index 0000000..7d5014b --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/service/impl/ProdOrderNoteServiceImpl.java @@ -0,0 +1,75 @@ +package com.aucma.production.service.impl; + +import java.util.List; + +import com.aucma.common.exception.ServiceException; +import com.aucma.common.utils.DateUtils; +import com.aucma.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.aucma.production.domain.ProdOrderNote; +import com.aucma.production.domain.ProdTaskPool; +import com.aucma.production.mapper.ProdOrderNoteMapper; +import com.aucma.production.mapper.ProdTaskPoolMapper; +import com.aucma.production.service.IProdOrderNoteService; + +@Service +public class ProdOrderNoteServiceImpl implements IProdOrderNoteService { + @Autowired + private ProdOrderNoteMapper prodOrderNoteMapper; + + @Autowired + private ProdTaskPoolMapper prodTaskPoolMapper; + + @Override + public ProdOrderNote selectProdOrderNoteByObjId(Long objId) { + return prodOrderNoteMapper.selectProdOrderNoteByObjId(objId); + } + + @Override + public List selectProdOrderNoteList(ProdOrderNote prodOrderNote) { + return prodOrderNoteMapper.selectProdOrderNoteList(prodOrderNote); + } + + @Override + public int insertProdOrderNote(ProdOrderNote prodOrderNote) { + validateNote(prodOrderNote); + prodOrderNote.setCreatedTime(DateUtils.getNowDate()); + return prodOrderNoteMapper.insertProdOrderNote(prodOrderNote); + } + + @Override + public int updateProdOrderNote(ProdOrderNote prodOrderNote) { + validateNote(prodOrderNote); + prodOrderNote.setUpdatedTime(DateUtils.getNowDate()); + return prodOrderNoteMapper.updateProdOrderNote(prodOrderNote); + } + + @Override + public int deleteProdOrderNoteByObjIds(Long[] objIds) { + return prodOrderNoteMapper.deleteProdOrderNoteByObjIds(objIds); + } + + private void validateNote(ProdOrderNote prodOrderNote) { + if (prodOrderNote == null) { + throw new ServiceException("工单记录不能为空"); + } + if (StringUtils.isBlank(prodOrderNote.getOrderCode())) { + throw new ServiceException("工单编号不能为空"); + } + if (StringUtils.isBlank(prodOrderNote.getNoteType())) { + throw new ServiceException("记录类型不能为空"); + } + if (StringUtils.isBlank(prodOrderNote.getNoteContent())) { + throw new ServiceException("记录内容不能为空"); + } + // 为什么新增备注前先校验工单存在:备注和异常记录属于工单执行过程资产,不能允许孤儿记录进入系统。 + ProdTaskPool orderSnapshot = prodTaskPoolMapper.selectProdTaskPoolByOrderCode(prodOrderNote.getOrderCode()); + if (orderSnapshot == null) { + throw new ServiceException("工单不存在,无法登记备注或异常"); + } + if (StringUtils.isBlank(prodOrderNote.getStatus())) { + prodOrderNote.setStatus("0"); + } + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/service/impl/ProdRouteServiceImpl.java b/aucma-production/src/main/java/com/aucma/production/service/impl/ProdRouteServiceImpl.java new file mode 100644 index 0000000..96741f9 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/service/impl/ProdRouteServiceImpl.java @@ -0,0 +1,132 @@ +package com.aucma.production.service.impl; + +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +import com.aucma.common.exception.ServiceException; +import com.aucma.common.utils.DateUtils; +import com.aucma.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.aucma.production.domain.ProdRoute; +import com.aucma.production.domain.ProdRouteDetail; +import com.aucma.production.mapper.ProdRouteMapper; +import com.aucma.production.service.IProdRouteService; + +@Service +public class ProdRouteServiceImpl implements IProdRouteService { + @Autowired + private ProdRouteMapper prodRouteMapper; + + @Override + public ProdRoute selectProdRouteByObjId(Long objId) { + ProdRoute route = prodRouteMapper.selectProdRouteByObjId(objId); + if (route != null) { + route.setDetailList(prodRouteMapper.selectProdRouteDetailListByRouteCode(route.getRouteCode())); + } + return route; + } + + @Override + public List selectProdRouteList(ProdRoute prodRoute) { + return prodRouteMapper.selectProdRouteList(prodRoute); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int insertProdRoute(ProdRoute prodRoute) { + validateRoute(prodRoute); + ensureRouteCodeUnique(prodRoute); + prodRoute.setCreatedTime(DateUtils.getNowDate()); + int rows = prodRouteMapper.insertProdRoute(prodRoute); + saveRouteDetails(prodRoute, true); + return rows; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int updateProdRoute(ProdRoute prodRoute) { + validateRoute(prodRoute); + ensureRouteCodeUnique(prodRoute); + prodRoute.setUpdatedTime(DateUtils.getNowDate()); + int rows = prodRouteMapper.updateProdRoute(prodRoute); + // 为什么更新时整单重建明细:首版路线维护优先保证“前端表格提交即数据库最终态”,避免逐行 diff 漏删旧工序。 + prodRouteMapper.deleteProdRouteDetailByRouteCode(prodRoute.getRouteCode()); + saveRouteDetails(prodRoute, false); + return rows; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int deleteProdRouteByObjIds(Long[] objIds) { + for (Long objId : objIds) { + ProdRoute route = prodRouteMapper.selectProdRouteByObjId(objId); + if (route != null) { + prodRouteMapper.deleteProdRouteDetailByRouteCode(route.getRouteCode()); + } + } + return prodRouteMapper.deleteProdRouteByObjIds(objIds); + } + + private void validateRoute(ProdRoute prodRoute) { + if (prodRoute == null) { + throw new ServiceException("工艺路线数据不能为空"); + } + if (StringUtils.isBlank(prodRoute.getRouteCode())) { + throw new ServiceException("路线编码不能为空"); + } + if (StringUtils.isBlank(prodRoute.getRouteName())) { + throw new ServiceException("路线名称不能为空"); + } + if (StringUtils.isBlank(prodRoute.getMaterialCode())) { + throw new ServiceException("物料不能为空"); + } + if (StringUtils.isBlank(prodRoute.getVersionNo())) { + prodRoute.setVersionNo("V1"); + } + if (StringUtils.isBlank(prodRoute.getStatus())) { + prodRoute.setStatus("0"); + } + if (prodRoute.getDetailList() == null || prodRoute.getDetailList().isEmpty()) { + throw new ServiceException("工艺路线至少需要一条工序明细"); + } + } + + private void ensureRouteCodeUnique(ProdRoute prodRoute) { + ProdRoute existed = prodRouteMapper.selectProdRouteByRouteCode(prodRoute.getRouteCode()); + if (existed != null && !existed.getObjId().equals(prodRoute.getObjId())) { + throw new ServiceException("路线编码已存在"); + } + } + + private void saveRouteDetails(ProdRoute prodRoute, boolean insertMode) { + Set processCodeSet = new LinkedHashSet(); + long sortNo = 1L; + for (ProdRouteDetail detail : prodRoute.getDetailList()) { + if (detail == null || StringUtils.isBlank(detail.getProcessCode())) { + throw new ServiceException("工序明细不能为空"); + } + if (!processCodeSet.add(detail.getProcessCode())) { + throw new ServiceException("工艺路线中存在重复工序:" + detail.getProcessCode()); + } + detail.setRouteCode(prodRoute.getRouteCode()); + if (detail.getSortNo() == null) { + detail.setSortNo(sortNo); + } + if (StringUtils.isBlank(detail.getRequiredFlag())) { + detail.setRequiredFlag("1"); + } + if (insertMode) { + detail.setCreatedBy(prodRoute.getCreatedBy()); + detail.setCreatedTime(DateUtils.getNowDate()); + } else { + detail.setUpdatedBy(prodRoute.getUpdatedBy()); + detail.setUpdatedTime(DateUtils.getNowDate()); + } + prodRouteMapper.insertProdRouteDetail(detail); + sortNo++; + } + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/service/impl/ProdStationCapabilityServiceImpl.java b/aucma-production/src/main/java/com/aucma/production/service/impl/ProdStationCapabilityServiceImpl.java new file mode 100644 index 0000000..e46d89f --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/service/impl/ProdStationCapabilityServiceImpl.java @@ -0,0 +1,72 @@ +package com.aucma.production.service.impl; + +import java.util.List; + +import com.aucma.common.exception.ServiceException; +import com.aucma.common.utils.DateUtils; +import com.aucma.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.aucma.production.domain.ProdStationCapability; +import com.aucma.production.mapper.ProdStationCapabilityMapper; +import com.aucma.production.service.IProdStationCapabilityService; + +@Service +public class ProdStationCapabilityServiceImpl implements IProdStationCapabilityService { + @Autowired + private ProdStationCapabilityMapper prodStationCapabilityMapper; + + @Override + public ProdStationCapability selectProdStationCapabilityByObjId(Long objId) { + return prodStationCapabilityMapper.selectProdStationCapabilityByObjId(objId); + } + + @Override + public List selectProdStationCapabilityList(ProdStationCapability prodStationCapability) { + return prodStationCapabilityMapper.selectProdStationCapabilityList(prodStationCapability); + } + + @Override + public int insertProdStationCapability(ProdStationCapability prodStationCapability) { + validateCapability(prodStationCapability); + // 为什么按“工位+物料”做唯一控制:这两个维度共同定义一条能力口径,重复落库会让排产和产能维护出现冲突。 + ensureUnique(prodStationCapability); + prodStationCapability.setCreatedTime(DateUtils.getNowDate()); + return prodStationCapabilityMapper.insertProdStationCapability(prodStationCapability); + } + + @Override + public int updateProdStationCapability(ProdStationCapability prodStationCapability) { + validateCapability(prodStationCapability); + ensureUnique(prodStationCapability); + prodStationCapability.setUpdatedTime(DateUtils.getNowDate()); + return prodStationCapabilityMapper.updateProdStationCapability(prodStationCapability); + } + + @Override + public int deleteProdStationCapabilityByObjIds(Long[] objIds) { + return prodStationCapabilityMapper.deleteProdStationCapabilityByObjIds(objIds); + } + + private void validateCapability(ProdStationCapability prodStationCapability) { + if (prodStationCapability == null) { + throw new ServiceException("工位能力数据不能为空"); + } + if (StringUtils.isBlank(prodStationCapability.getStationCode())) { + throw new ServiceException("工位不能为空"); + } + if (StringUtils.isBlank(prodStationCapability.getMaterialCode())) { + throw new ServiceException("物料不能为空"); + } + if (StringUtils.isBlank(prodStationCapability.getStatus())) { + prodStationCapability.setStatus("0"); + } + } + + private void ensureUnique(ProdStationCapability prodStationCapability) { + ProdStationCapability existed = prodStationCapabilityMapper.selectByStationCodeAndMaterialCode(prodStationCapability); + if (existed != null && !existed.getObjId().equals(prodStationCapability.getObjId())) { + throw new ServiceException("同一工位下该物料的能力维护已存在"); + } + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/service/impl/ProdTaskPoolServiceImpl.java b/aucma-production/src/main/java/com/aucma/production/service/impl/ProdTaskPoolServiceImpl.java new file mode 100644 index 0000000..ee257e5 --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/service/impl/ProdTaskPoolServiceImpl.java @@ -0,0 +1,96 @@ +package com.aucma.production.service.impl; + +import java.util.List; + +import com.aucma.common.exception.ServiceException; +import com.aucma.common.utils.DateUtils; +import com.aucma.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.aucma.production.domain.ProdTaskPool; +import com.aucma.production.mapper.ProdTaskPoolMapper; +import com.aucma.production.service.IProdTaskPoolService; + +@Service +public class ProdTaskPoolServiceImpl implements IProdTaskPoolService { + @Autowired + private ProdTaskPoolMapper prodTaskPoolMapper; + + @Override + public ProdTaskPool selectProdTaskPoolByOrderCode(String orderCode) { + return prodTaskPoolMapper.selectProdTaskPoolByOrderCode(orderCode); + } + + @Override + public List selectProdTaskPoolList(ProdTaskPool prodTaskPool) { + return prodTaskPoolMapper.selectProdTaskPoolList(prodTaskPool); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int insertProdTaskPool(ProdTaskPool prodTaskPool) { + validateTask(prodTaskPool); + ProdTaskPool existed = prodTaskPoolMapper.selectProdTaskPoolByOrderCode(prodTaskPool.getOrderCode()); + if (existed != null && existed.getObjId() != null) { + prodTaskPool.setObjId(existed.getObjId()); + prodTaskPool.setUpdatedTime(DateUtils.getNowDate()); + return prodTaskPoolMapper.updateProdTaskPool(prodTaskPool); + } + prodTaskPool.setCreatedTime(DateUtils.getNowDate()); + return prodTaskPoolMapper.insertProdTaskPool(prodTaskPool); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int updateProdTaskPool(ProdTaskPool prodTaskPool) { + validateTask(prodTaskPool); + ProdTaskPool existed = prodTaskPoolMapper.selectProdTaskPoolByOrderCode(prodTaskPool.getOrderCode()); + if (existed == null || existed.getObjId() == null) { + prodTaskPool.setCreatedTime(DateUtils.getNowDate()); + return prodTaskPoolMapper.insertProdTaskPool(prodTaskPool); + } + prodTaskPool.setObjId(existed.getObjId()); + prodTaskPool.setUpdatedTime(DateUtils.getNowDate()); + return prodTaskPoolMapper.updateProdTaskPool(prodTaskPool); + } + + @Override + public int deleteProdTaskPoolByOrderCodes(String[] orderCodes) { + return prodTaskPoolMapper.deleteProdTaskPoolByOrderCodes(orderCodes); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public int changeTaskStatus(ProdTaskPool prodTaskPool) { + if (prodTaskPool == null || StringUtils.isBlank(prodTaskPool.getOrderCode())) { + throw new ServiceException("工单编号不能为空"); + } + if (StringUtils.isBlank(prodTaskPool.getExecutionStatus())) { + throw new ServiceException("执行状态不能为空"); + } + ProdTaskPool snapshot = prodTaskPoolMapper.selectProdTaskPoolByOrderCode(prodTaskPool.getOrderCode()); + if (snapshot == null) { + throw new ServiceException("工单不存在,无法变更任务状态"); + } + // 为什么任务池状态直接回写工单执行状态:任务池只是执行视图,不能再维护一套脱离工单主表的状态副本。 + prodTaskPool.setUpdatedTime(DateUtils.getNowDate()); + return prodTaskPoolMapper.updateOrderExecutionStatus(prodTaskPool); + } + + private void validateTask(ProdTaskPool prodTaskPool) { + if (prodTaskPool == null) { + throw new ServiceException("任务池数据不能为空"); + } + if (StringUtils.isBlank(prodTaskPool.getOrderCode())) { + throw new ServiceException("工单编号不能为空"); + } + ProdTaskPool snapshot = prodTaskPoolMapper.selectProdTaskPoolByOrderCode(prodTaskPool.getOrderCode()); + if (snapshot == null) { + throw new ServiceException("工单不存在,无法维护任务池"); + } + if (StringUtils.isBlank(prodTaskPool.getPriorityLevel())) { + prodTaskPool.setPriorityLevel("NORMAL"); + } + } +} diff --git a/aucma-production/src/main/java/com/aucma/production/service/impl/ProdTeamShiftServiceImpl.java b/aucma-production/src/main/java/com/aucma/production/service/impl/ProdTeamShiftServiceImpl.java new file mode 100644 index 0000000..c745ddc --- /dev/null +++ b/aucma-production/src/main/java/com/aucma/production/service/impl/ProdTeamShiftServiceImpl.java @@ -0,0 +1,74 @@ +package com.aucma.production.service.impl; + +import java.util.List; + +import com.aucma.common.exception.ServiceException; +import com.aucma.common.utils.DateUtils; +import com.aucma.common.utils.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.aucma.production.domain.ProdTeamShift; +import com.aucma.production.mapper.ProdTeamShiftMapper; +import com.aucma.production.service.IProdTeamShiftService; + +@Service +public class ProdTeamShiftServiceImpl implements IProdTeamShiftService { + @Autowired + private ProdTeamShiftMapper prodTeamShiftMapper; + + @Override + public ProdTeamShift selectProdTeamShiftByObjId(Long objId) { + return prodTeamShiftMapper.selectProdTeamShiftByObjId(objId); + } + + @Override + public List selectProdTeamShiftList(ProdTeamShift prodTeamShift) { + return prodTeamShiftMapper.selectProdTeamShiftList(prodTeamShift); + } + + @Override + public int insertProdTeamShift(ProdTeamShift prodTeamShift) { + validateShift(prodTeamShift); + ensureShiftUnique(prodTeamShift); + prodTeamShift.setCreatedTime(DateUtils.getNowDate()); + return prodTeamShiftMapper.insertProdTeamShift(prodTeamShift); + } + + @Override + public int updateProdTeamShift(ProdTeamShift prodTeamShift) { + validateShift(prodTeamShift); + ensureShiftUnique(prodTeamShift); + prodTeamShift.setUpdatedTime(DateUtils.getNowDate()); + return prodTeamShiftMapper.updateProdTeamShift(prodTeamShift); + } + + @Override + public int deleteProdTeamShiftByObjIds(Long[] objIds) { + return prodTeamShiftMapper.deleteProdTeamShiftByObjIds(objIds); + } + + private void validateShift(ProdTeamShift prodTeamShift) { + if (prodTeamShift == null) { + throw new ServiceException("排班数据不能为空"); + } + if (StringUtils.isBlank(prodTeamShift.getTeamCode())) { + throw new ServiceException("班组不能为空"); + } + if (prodTeamShift.getShiftDate() == null) { + throw new ServiceException("排班日期不能为空"); + } + if (StringUtils.isBlank(prodTeamShift.getShiftCode())) { + throw new ServiceException("班次不能为空"); + } + if (StringUtils.isBlank(prodTeamShift.getStatus())) { + prodTeamShift.setStatus("0"); + } + } + + private void ensureShiftUnique(ProdTeamShift prodTeamShift) { + ProdTeamShift existed = prodTeamShiftMapper.selectUniqueShift(prodTeamShift); + if (existed != null && !existed.getObjId().equals(prodTeamShift.getObjId())) { + throw new ServiceException("该班组在指定日期与班次下已存在排班记录"); + } + } +} diff --git a/aucma-production/src/main/resources/mapper/production/ProdOrderNoteMapper.xml b/aucma-production/src/main/resources/mapper/production/ProdOrderNoteMapper.xml new file mode 100644 index 0000000..2bacfdc --- /dev/null +++ b/aucma-production/src/main/resources/mapper/production/ProdOrderNoteMapper.xml @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + select pn.obj_id, + pn.order_code, + oi.material_code, + oi.material_name, + nvl(oi.execution_status, 'PENDING') as execution_status, + pn.note_type, + pn.note_content, + pn.status, + pn.remark, + pn.create_by, + pn.create_time, + pn.update_by, + pn.update_time + from prod_order_note pn + left join base_orderinfo oi on oi.order_code = pn.order_code + + + + + + + + + select seq_prod_order_note.nextval as objId from dual + + insert into prod_order_note ( + obj_id, order_code, note_type, note_content, status, remark, + create_by, create_time, update_by, update_time + ) values ( + #{objId}, #{orderCode}, #{noteType}, #{noteContent}, #{status}, #{remark}, + #{createdBy}, #{createdTime}, #{updatedBy}, #{updatedTime} + ) + + + + update prod_order_note + + order_code = #{orderCode}, + note_type = #{noteType}, + note_content = #{noteContent}, + status = #{status}, + remark = #{remark}, + update_by = #{updatedBy}, + update_time = #{updatedTime} + + where obj_id = #{objId} + + + + delete from prod_order_note where obj_id = #{objId} + + + + delete from prod_order_note where obj_id in + + #{objId} + + + diff --git a/aucma-production/src/main/resources/mapper/production/ProdRouteMapper.xml b/aucma-production/src/main/resources/mapper/production/ProdRouteMapper.xml new file mode 100644 index 0000000..85cc8a0 --- /dev/null +++ b/aucma-production/src/main/resources/mapper/production/ProdRouteMapper.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select pr.obj_id, + pr.route_code, + pr.route_name, + pr.material_code, + mi.material_name, + pr.version_no, + pr.status, + pr.remark, + pr.create_by, + pr.create_time, + pr.update_by, + pr.update_time + from prod_route pr + left join base_materialinfo mi on mi.material_code = pr.material_code + + + + + + + + + + + + + select seq_prod_route.nextval as objId from dual + + insert into prod_route ( + obj_id, route_code, route_name, material_code, version_no, status, remark, + create_by, create_time, update_by, update_time + ) values ( + #{objId}, #{routeCode}, #{routeName}, #{materialCode}, #{versionNo}, #{status}, #{remark}, + #{createdBy}, #{createdTime}, #{updatedBy}, #{updatedTime} + ) + + + + update prod_route + + route_code = #{routeCode}, + route_name = #{routeName}, + material_code = #{materialCode}, + version_no = #{versionNo}, + status = #{status}, + remark = #{remark}, + update_by = #{updatedBy}, + update_time = #{updatedTime} + + where obj_id = #{objId} + + + + delete from prod_route where obj_id = #{objId} + + + + delete from prod_route where obj_id in + + #{objId} + + + + + + select seq_prod_route_dtl.nextval as objId from dual + + insert into prod_route_dtl ( + obj_id, route_code, process_code, sort_no, required_flag, standard_work_time, remark, + create_by, create_time, update_by, update_time + ) values ( + #{objId}, #{routeCode}, #{processCode}, #{sortNo}, #{requiredFlag}, #{standardWorkTime}, #{remark}, + #{createdBy}, #{createdTime}, #{updatedBy}, #{updatedTime} + ) + + + + delete from prod_route_dtl where route_code = #{routeCode} + + diff --git a/aucma-production/src/main/resources/mapper/production/ProdStationCapabilityMapper.xml b/aucma-production/src/main/resources/mapper/production/ProdStationCapabilityMapper.xml new file mode 100644 index 0000000..145a5a9 --- /dev/null +++ b/aucma-production/src/main/resources/mapper/production/ProdStationCapabilityMapper.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + select sc.obj_id, + sc.station_code, + st.product_line_name as station_name, + sc.material_code, + mi.material_name, + sc.standard_ct, + sc.shift_cap, + sc.day_cap, + sc.changeover_min, + sc.team_code, + tm.team_name, + sc.status, + sc.remark, + sc.create_by, + sc.create_time, + sc.update_by, + sc.update_time + from prod_sta_cap sc + left join base_productline st on st.product_line_code = sc.station_code + left join base_materialinfo mi on mi.material_code = sc.material_code + left join base_teammembers tm on tm.team_code = sc.team_code + + + + + + + + + + + select seq_prod_sta_cap.nextval as objId from dual + + insert into prod_sta_cap ( + obj_id, station_code, material_code, standard_ct, shift_cap, day_cap, changeover_min, + team_code, status, remark, create_by, create_time, update_by, update_time + ) values ( + #{objId}, #{stationCode}, #{materialCode}, #{standardCt}, #{shiftCap}, #{dayCap}, #{changeoverMin}, + #{teamCode}, #{status}, #{remark}, #{createdBy}, #{createdTime}, #{updatedBy}, #{updatedTime} + ) + + + + update prod_sta_cap + + station_code = #{stationCode}, + material_code = #{materialCode}, + standard_ct = #{standardCt}, + shift_cap = #{shiftCap}, + day_cap = #{dayCap}, + changeover_min = #{changeoverMin}, + team_code = #{teamCode}, + status = #{status}, + remark = #{remark}, + update_by = #{updatedBy}, + update_time = #{updatedTime} + + where obj_id = #{objId} + + + + delete from prod_sta_cap where obj_id = #{objId} + + + + delete from prod_sta_cap where obj_id in + + #{objId} + + + diff --git a/aucma-production/src/main/resources/mapper/production/ProdTaskPoolMapper.xml b/aucma-production/src/main/resources/mapper/production/ProdTaskPoolMapper.xml new file mode 100644 index 0000000..5b33b9e --- /dev/null +++ b/aucma-production/src/main/resources/mapper/production/ProdTaskPoolMapper.xml @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select tp.obj_id, + oi.order_code, + oi.material_code, + oi.material_name, + oi.order_amount, + oi.complete_amount, + nvl(oi.execution_status, 'PENDING') as execution_status, + case + when exists ( + select 1 + from prod_order_note pn + where pn.order_code = oi.order_code + and pn.status = '0' + and pn.note_type in ('ABNORMAL', 'LACK_MATERIAL', 'DELAY', 'LINE_CHANGE', 'CLOSE_REASON') + ) then 'ABNORMAL' + when nvl(oi.execution_status, 'PENDING') = 'COMPLETED' then 'COMPLETED' + when nvl(oi.execution_status, 'PENDING') = 'RUNNING' then 'RUNNING' + when oi.end_date is not null and oi.end_date < trunc(sysdate) and nvl(oi.execution_status, 'PENDING') <> 'COMPLETED' then 'OVERTIME' + else 'PENDING' + end as task_bucket, + tp.owner_user_id, + su.nick_name as owner_user_name, + nvl(tp.priority_level, 'NORMAL') as priority_level, + oi.device_code, + oi.end_date, + oi.start_time, + oi.end_time as finish_time, + tp.task_remark, + tp.create_by, + tp.create_time, + tp.update_by, + tp.update_time + from base_orderinfo oi + left join prod_task_pool tp on tp.order_code = oi.order_code + left join z_sys_user su on su.user_id = tp.owner_user_id + + + + + + + + + select seq_prod_task_pool.nextval as objId from dual + + insert into prod_task_pool ( + obj_id, order_code, owner_user_id, priority_level, task_remark, + create_by, create_time, update_by, update_time + ) values ( + #{objId}, #{orderCode}, #{ownerUserId}, #{priorityLevel}, #{remark}, + #{createdBy}, #{createdTime}, #{updatedBy}, #{updatedTime} + ) + + + + update prod_task_pool + + owner_user_id = #{ownerUserId}, + priority_level = #{priorityLevel}, + task_remark = #{remark}, + update_by = #{updatedBy}, + update_time = #{updatedTime} + + where order_code = #{orderCode} + + + + delete from prod_task_pool where order_code in + + #{orderCode} + + + + + update base_orderinfo + set execution_status = #{executionStatus}, + start_time = case when #{executionStatus} = 'RUNNING' and start_time is null then sysdate else start_time end, + end_time = case when #{executionStatus} = 'COMPLETED' then sysdate else end_time end, + complete_date = case when #{executionStatus} = 'COMPLETED' then trunc(sysdate) else complete_date end, + updated_time = #{updatedTime} + where order_code = #{orderCode} + + diff --git a/aucma-production/src/main/resources/mapper/production/ProdTeamShiftMapper.xml b/aucma-production/src/main/resources/mapper/production/ProdTeamShiftMapper.xml new file mode 100644 index 0000000..af3d80f --- /dev/null +++ b/aucma-production/src/main/resources/mapper/production/ProdTeamShiftMapper.xml @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + select ts.obj_id, + ts.team_code, + tm.team_name, + ts.shift_date, + ts.shift_code, + ts.leader_user_id, + su.nick_name as leader_user_name, + ts.line_code, + pl.product_line_name as line_name, + ts.area_desc, + ts.status, + ts.remark, + ts.create_by, + ts.create_time, + ts.update_by, + ts.update_time + from prod_team_sch ts + left join base_teammembers tm on tm.team_code = ts.team_code + left join z_sys_user su on su.user_id = ts.leader_user_id + left join base_productline pl on pl.product_line_code = ts.line_code + + + + + + + + + + + select seq_prod_team_sch.nextval as objId from dual + + insert into prod_team_sch ( + obj_id, team_code, shift_date, shift_code, leader_user_id, line_code, area_desc, status, + remark, create_by, create_time, update_by, update_time + ) values ( + #{objId}, #{teamCode}, #{shiftDate}, #{shiftCode}, #{leaderUserId}, #{lineCode}, #{areaDesc}, #{status}, + #{remark}, #{createdBy}, #{createdTime}, #{updatedBy}, #{updatedTime} + ) + + + + update prod_team_sch + + team_code = #{teamCode}, + shift_date = #{shiftDate}, + shift_code = #{shiftCode}, + leader_user_id = #{leaderUserId}, + line_code = #{lineCode}, + area_desc = #{areaDesc}, + status = #{status}, + remark = #{remark}, + update_by = #{updatedBy}, + update_time = #{updatedTime} + + where obj_id = #{objId} + + + + delete from prod_team_sch where obj_id = #{objId} + + + + delete from prod_team_sch where obj_id in + + #{objId} + + + diff --git a/aucma-report/quality_trace_data.sql b/aucma-report/quality_trace_data.sql new file mode 100644 index 0000000..b305c8f --- /dev/null +++ b/aucma-report/quality_trace_data.sql @@ -0,0 +1,110 @@ +-- ============================================= +-- 质量追溯测试数据(Board4看板) +-- 表:REPORT_QUALITY_INSPECTION +-- 说明:使用真实澳柯玛产品型号,合格率90%以上 +-- Oracle 11 兼容版本 +-- ============================================= + +-- ============================================= +-- 步骤1:创建序列(如果不存在) +-- ============================================= +BEGIN EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_REPORT_QUALITY_INSPECTION'; EXCEPTION WHEN OTHERS THEN NULL; END; +/ + +CREATE SEQUENCE SEQ_REPORT_QUALITY_INSPECTION + START WITH 1 + INCREMENT BY 1 + NOCACHE + NOCYCLE; + +-- ============================================= +-- 步骤2:清理现有测试数据(可选) +-- ============================================= +-- DELETE FROM REPORT_QUALITY_INSPECTION WHERE MATERIAL_NAME IN ('BD-150NF', 'BC/BD-150HY(N)', 'BC/BD-150HY', 'BD-150AF', 'AF-150KF', 'BD-150HA', 'BC/BD-150HE', 'BD(C)-410T', 'BC/BD-252PDHNY', 'BC/BD-252PDHN'); +-- COMMIT; + +-- ============================================= +-- 步骤3:插入质量追溯测试数据 +-- 产品合格率设计(全部90%以上): +-- 1. BD-150NF - 100% (10/10) +-- 2. BC/BD-150HY(N) - 100% (10/10) +-- 3. BC/BD-150HY - 100% (10/10) +-- 4. BD-150AF - 100% (10/10) +-- 5. AF-150KF - 100% (10/10) +-- 6. BD-150HA - 100% (10/10) +-- 7. BC/BD-150HE - 100% (10/10) +-- 8. BD(C)-410T - 100% (10/10) +-- 9. BC/BD-252PDHNY - 100% (10/10) +-- 10. BC/BD-252PDHN - 90% (9/10) +-- ============================================= + +-- 产品1: BD-150NF - 100%合格 (10条全部合格) +INSERT INTO REPORT_QUALITY_INSPECTION (OBJ_ID, BAR_CODE, MATERIAL_NAME, PROCESS_CODE, TEST_ITEM_CODE, TREATMENT_MEASURE, INSPECTOR_TIME, IS_FLAG) +SELECT SEQ_REPORT_QUALITY_INSPECTION.NEXTVAL, 'BC' || LPAD(LEVEL, 4, '0'), 'BD-150NF', 'P001', 'T001', '3', SYSDATE - DBMS_RANDOM.VALUE(0, 30), 1 FROM DUAL CONNECT BY LEVEL <= 10; + +-- 产品2: BC/BD-150HY(N) - 100%合格 (10条全部合格) +INSERT INTO REPORT_QUALITY_INSPECTION (OBJ_ID, BAR_CODE, MATERIAL_NAME, PROCESS_CODE, TEST_ITEM_CODE, TREATMENT_MEASURE, INSPECTOR_TIME, IS_FLAG) +SELECT SEQ_REPORT_QUALITY_INSPECTION.NEXTVAL, 'BC' || LPAD(LEVEL, 4, '0'), 'BC/BD-150HY(N)', 'P002', 'T002', '3', SYSDATE - DBMS_RANDOM.VALUE(0, 30), 1 FROM DUAL CONNECT BY LEVEL <= 10; + +-- 产品3: BC/BD-150HY - 100%合格 (10条全部合格) +INSERT INTO REPORT_QUALITY_INSPECTION (OBJ_ID, BAR_CODE, MATERIAL_NAME, PROCESS_CODE, TEST_ITEM_CODE, TREATMENT_MEASURE, INSPECTOR_TIME, IS_FLAG) +SELECT SEQ_REPORT_QUALITY_INSPECTION.NEXTVAL, 'BC' || LPAD(LEVEL, 4, '0'), 'BC/BD-150HY', 'P003', 'T003', '3', SYSDATE - DBMS_RANDOM.VALUE(0, 30), 1 FROM DUAL CONNECT BY LEVEL <= 10; + +-- 产品4: BD-150AF - 100%合格 (10条全部合格) +INSERT INTO REPORT_QUALITY_INSPECTION (OBJ_ID, BAR_CODE, MATERIAL_NAME, PROCESS_CODE, TEST_ITEM_CODE, TREATMENT_MEASURE, INSPECTOR_TIME, IS_FLAG) +SELECT SEQ_REPORT_QUALITY_INSPECTION.NEXTVAL, 'BC' || LPAD(LEVEL, 4, '0'), 'BD-150AF', 'P004', 'T004', '3', SYSDATE - DBMS_RANDOM.VALUE(0, 30), 1 FROM DUAL CONNECT BY LEVEL <= 10; + +-- 产品5: AF-150KF - 100%合格 (10条全部合格) +INSERT INTO REPORT_QUALITY_INSPECTION (OBJ_ID, BAR_CODE, MATERIAL_NAME, PROCESS_CODE, TEST_ITEM_CODE, TREATMENT_MEASURE, INSPECTOR_TIME, IS_FLAG) +SELECT SEQ_REPORT_QUALITY_INSPECTION.NEXTVAL, 'BC' || LPAD(LEVEL, 4, '0'), 'AF-150KF', 'P005', 'T005', '3', SYSDATE - DBMS_RANDOM.VALUE(0, 30), 1 FROM DUAL CONNECT BY LEVEL <= 10; + +-- 产品6: BD-150HA - 100%合格 (10条全部合格) +INSERT INTO REPORT_QUALITY_INSPECTION (OBJ_ID, BAR_CODE, MATERIAL_NAME, PROCESS_CODE, TEST_ITEM_CODE, TREATMENT_MEASURE, INSPECTOR_TIME, IS_FLAG) +SELECT SEQ_REPORT_QUALITY_INSPECTION.NEXTVAL, 'BC' || LPAD(LEVEL, 4, '0'), 'BD-150HA', 'P006', 'T006', '3', SYSDATE - DBMS_RANDOM.VALUE(0, 30), 1 FROM DUAL CONNECT BY LEVEL <= 10; + +-- 产品7: BC/BD-150HE - 100%合格 (10条全部合格) +INSERT INTO REPORT_QUALITY_INSPECTION (OBJ_ID, BAR_CODE, MATERIAL_NAME, PROCESS_CODE, TEST_ITEM_CODE, TREATMENT_MEASURE, INSPECTOR_TIME, IS_FLAG) +SELECT SEQ_REPORT_QUALITY_INSPECTION.NEXTVAL, 'BC' || LPAD(LEVEL, 4, '0'), 'BC/BD-150HE', 'P007', 'T007', '3', SYSDATE - DBMS_RANDOM.VALUE(0, 30), 1 FROM DUAL CONNECT BY LEVEL <= 10; + +-- 产品8: BD(C)-410T - 100%合格 (10条全部合格) +INSERT INTO REPORT_QUALITY_INSPECTION (OBJ_ID, BAR_CODE, MATERIAL_NAME, PROCESS_CODE, TEST_ITEM_CODE, TREATMENT_MEASURE, INSPECTOR_TIME, IS_FLAG) +SELECT SEQ_REPORT_QUALITY_INSPECTION.NEXTVAL, 'BC' || LPAD(LEVEL, 4, '0'), 'BD(C)-410T', 'P008', 'T008', '3', SYSDATE - DBMS_RANDOM.VALUE(0, 30), 1 FROM DUAL CONNECT BY LEVEL <= 10; + +-- 产品9: BC/BD-252PDHNY - 100%合格 (10条全部合格) +INSERT INTO REPORT_QUALITY_INSPECTION (OBJ_ID, BAR_CODE, MATERIAL_NAME, PROCESS_CODE, TEST_ITEM_CODE, TREATMENT_MEASURE, INSPECTOR_TIME, IS_FLAG) +SELECT SEQ_REPORT_QUALITY_INSPECTION.NEXTVAL, 'BC' || LPAD(LEVEL, 4, '0'), 'BC/BD-252PDHNY', 'P009', 'T009', '3', SYSDATE - DBMS_RANDOM.VALUE(0, 30), 1 FROM DUAL CONNECT BY LEVEL <= 10; + +-- 产品10: BC/BD-252PDHN - 90%合格 (9条合格 + 1条返修) +INSERT INTO REPORT_QUALITY_INSPECTION (OBJ_ID, BAR_CODE, MATERIAL_NAME, PROCESS_CODE, TEST_ITEM_CODE, TREATMENT_MEASURE, INSPECTOR_TIME, IS_FLAG) +SELECT SEQ_REPORT_QUALITY_INSPECTION.NEXTVAL, 'BC' || LPAD(LEVEL, 4, '0'), 'BC/BD-252PDHN', 'P010', 'T010', '3', SYSDATE - DBMS_RANDOM.VALUE(0, 30), 1 FROM DUAL CONNECT BY LEVEL <= 9; + +INSERT INTO REPORT_QUALITY_INSPECTION (OBJ_ID, BAR_CODE, MATERIAL_NAME, PROCESS_CODE, TEST_ITEM_CODE, TREATMENT_MEASURE, INSPECTOR_TIME, IS_FLAG) +VALUES (SEQ_REPORT_QUALITY_INSPECTION.NEXTVAL, 'BC0010', 'BC/BD-252PDHN', 'P010', 'T010', '1', SYSDATE - DBMS_RANDOM.VALUE(0, 30), 1); + +COMMIT; + +-- ============================================= +-- 步骤4:验证数据 +-- ============================================= +-- 查看各产品的质检统计 +SELECT MATERIAL_NAME AS 产品名称, + COUNT(*) AS 总数量, + SUM(CASE WHEN TREATMENT_MEASURE = '3' THEN 1 ELSE 0 END) AS 合格数, + SUM(CASE WHEN TREATMENT_MEASURE = '1' THEN 1 ELSE 0 END) AS 返修数, + ROUND(SUM(CASE WHEN TREATMENT_MEASURE = '3' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 0) AS 合格率 +FROM REPORT_QUALITY_INSPECTION +WHERE MATERIAL_NAME IN ('BD-150NF', 'BC/BD-150HY(N)', 'BC/BD-150HY', 'BD-150AF', 'AF-150KF', + 'BD-150HA', 'BC/BD-150HE', 'BD(C)-410T', 'BC/BD-252PDHNY', 'BC/BD-252PDHN') +GROUP BY MATERIAL_NAME +ORDER BY 合格率 DESC; + +-- 查看插入的总记录数 +SELECT COUNT(*) AS 总记录数 FROM REPORT_QUALITY_INSPECTION; + +-- ============================================= +-- 清理测试数据(如需删除,执行以下语句) +-- ============================================= +-- DELETE FROM REPORT_QUALITY_INSPECTION +-- WHERE MATERIAL_NAME IN ('BD-150NF', 'BC/BD-150HY(N)', 'BC/BD-150HY', 'BD-150AF', 'AF-150KF', +-- 'BD-150HA', 'BC/BD-150HE', 'BD(C)-410T', 'BC/BD-252PDHNY', 'BC/BD-252PDHN'); +-- COMMIT;