From 323da20f2a0fb43e3b41c8aa4ed1fd22b221bf75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=98=8A=E5=A4=A9?= <15984976+n2319_0@user.noreply.gitee.com> Date: Tue, 2 Jun 2026 21:27:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=90=8C=E7=BC=96=E8=BE=91=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GearProductionTaskController.java | 56 ++++ .../mapper/GearProductionTaskMapper.java | 5 + .../service/IGearProductionTaskService.java | 12 + .../impl/GearProductionTaskServiceImpl.java | 163 +++++++++- .../production/GearProductionTaskMapper.xml | 10 + .../oa/controller/GearContractController.java | 71 +++++ .../java/com/gear/oa/domain/GearContract.java | 45 +++ .../com/gear/oa/domain/bo/GearContractBo.java | 54 ++++ .../com/gear/oa/domain/vo/GearContractVo.java | 49 +++ .../gear/oa/mapper/GearContractMapper.java | 9 + .../gear/oa/service/IGearContractService.java | 25 ++ .../service/impl/GearContractServiceImpl.java | 108 +++++++ gear-ui3/src/api/mes/productionTask.js | 43 +++ gear-ui3/src/api/oms/contract.js | 40 +++ gear-ui3/src/views/mes/production/index.vue | 287 +++++++++++++++++- gear-ui3/src/views/oms/contractEdit/index.vue | 284 +++++++++++++++++ gear-ui3/src/views/system/user/index.vue | 33 +- script/sql/mysql/item/gear_contract.sql | 35 +++ script/sql/mysql/item/sys_menu.sql | 2 + 19 files changed, 1301 insertions(+), 30 deletions(-) create mode 100644 gear-oa/src/main/java/com/gear/oa/controller/GearContractController.java create mode 100644 gear-oa/src/main/java/com/gear/oa/domain/GearContract.java create mode 100644 gear-oa/src/main/java/com/gear/oa/domain/bo/GearContractBo.java create mode 100644 gear-oa/src/main/java/com/gear/oa/domain/vo/GearContractVo.java create mode 100644 gear-oa/src/main/java/com/gear/oa/mapper/GearContractMapper.java create mode 100644 gear-oa/src/main/java/com/gear/oa/service/IGearContractService.java create mode 100644 gear-oa/src/main/java/com/gear/oa/service/impl/GearContractServiceImpl.java create mode 100644 gear-ui3/src/api/oms/contract.js create mode 100644 gear-ui3/src/views/oms/contractEdit/index.vue create mode 100644 script/sql/mysql/item/gear_contract.sql diff --git a/gear-mes/src/main/java/com/gear/mes/production/controller/GearProductionTaskController.java b/gear-mes/src/main/java/com/gear/mes/production/controller/GearProductionTaskController.java index cae7f26..1ece219 100644 --- a/gear-mes/src/main/java/com/gear/mes/production/controller/GearProductionTaskController.java +++ b/gear-mes/src/main/java/com/gear/mes/production/controller/GearProductionTaskController.java @@ -9,12 +9,14 @@ import com.gear.mes.production.domain.vo.GearProductionTaskListVo; import com.gear.mes.production.domain.vo.GearProductionTaskWithDetailVo; import com.gear.mes.production.service.IGearProductionTaskService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.PutMapping; import java.util.List; @@ -54,4 +56,58 @@ public class GearProductionTaskController extends BaseController { } return R.ok(); } + + @PostMapping("/{taskId}/uncomplete") + public R uncomplete(@PathVariable("taskId") Long taskId) { + boolean ok = productionTaskService.uncompleteTask(taskId); + if (!ok) { + return R.fail("撤销完成失败"); + } + return R.ok(); + } + + @PostMapping("/{taskId}/start") + public R start(@PathVariable("taskId") Long taskId) { + boolean ok = productionTaskService.startTask(taskId); + if (!ok) { + return R.fail("开始失败"); + } + return R.ok(); + } + + @PostMapping("/{taskId}/pause") + public R pause(@PathVariable("taskId") Long taskId) { + boolean ok = productionTaskService.pauseTask(taskId); + if (!ok) { + return R.fail("暂停失败"); + } + return R.ok(); + } + + @PostMapping("/{taskId}/resume") + public R resume(@PathVariable("taskId") Long taskId) { + boolean ok = productionTaskService.resumeTask(taskId); + if (!ok) { + return R.fail("继续失败"); + } + return R.ok(); + } + + @PutMapping + public R edit(@RequestBody GearProductionTaskWithDetailVo bo) { + boolean ok = productionTaskService.updateTaskWithDetail(bo); + if (!ok) { + return R.fail("修改失败"); + } + return R.ok(); + } + + @DeleteMapping("/{taskId}") + public R remove(@PathVariable("taskId") Long taskId) { + boolean ok = productionTaskService.deleteTask(taskId); + if (!ok) { + return R.fail("删除失败"); + } + return R.ok(); + } } diff --git a/gear-mes/src/main/java/com/gear/mes/production/mapper/GearProductionTaskMapper.java b/gear-mes/src/main/java/com/gear/mes/production/mapper/GearProductionTaskMapper.java index d82476e..ae48279 100644 --- a/gear-mes/src/main/java/com/gear/mes/production/mapper/GearProductionTaskMapper.java +++ b/gear-mes/src/main/java/com/gear/mes/production/mapper/GearProductionTaskMapper.java @@ -20,4 +20,9 @@ public interface GearProductionTaskMapper { @Param("status") String status, @Param("updateBy") String updateBy, @Param("updateTime") Date updateTime); + + int updateDelFlag(@Param("taskId") Long taskId, + @Param("delFlag") String delFlag, + @Param("updateBy") String updateBy, + @Param("updateTime") Date updateTime); } diff --git a/gear-mes/src/main/java/com/gear/mes/production/service/IGearProductionTaskService.java b/gear-mes/src/main/java/com/gear/mes/production/service/IGearProductionTaskService.java index 91c3d94..2d79603 100644 --- a/gear-mes/src/main/java/com/gear/mes/production/service/IGearProductionTaskService.java +++ b/gear-mes/src/main/java/com/gear/mes/production/service/IGearProductionTaskService.java @@ -14,4 +14,16 @@ public interface IGearProductionTaskService { Long insertTaskWithDetail(GearProductionTaskWithDetailVo bo); boolean completeTask(Long taskId); + + boolean uncompleteTask(Long taskId); + + boolean startTask(Long taskId); + + boolean pauseTask(Long taskId); + + boolean resumeTask(Long taskId); + + boolean updateTaskWithDetail(GearProductionTaskWithDetailVo bo); + + boolean deleteTask(Long taskId); } diff --git a/gear-mes/src/main/java/com/gear/mes/production/service/impl/GearProductionTaskServiceImpl.java b/gear-mes/src/main/java/com/gear/mes/production/service/impl/GearProductionTaskServiceImpl.java index 90eee07..f6e5b3e 100644 --- a/gear-mes/src/main/java/com/gear/mes/production/service/impl/GearProductionTaskServiceImpl.java +++ b/gear-mes/src/main/java/com/gear/mes/production/service/impl/GearProductionTaskServiceImpl.java @@ -7,7 +7,9 @@ import com.gear.mes.production.domain.GearProductionTaskProduct; import com.gear.mes.production.domain.vo.GearProductionTaskListVo; import com.gear.mes.production.domain.vo.GearProductionTaskMaterialVo; import com.gear.mes.production.domain.vo.GearProductionTaskWithDetailVo; +import com.gear.mes.production.domain.vo.GearProductionTaskProductVo; import com.gear.common.utils.DateUtils; +import com.gear.common.helper.LoginHelper; import com.gear.mes.production.mapper.GearProductionTaskMapper; import com.gear.mes.production.mapper.GearProductionTaskMaterialMapper; import com.gear.mes.production.mapper.GearProductionTaskProductMapper; @@ -72,8 +74,11 @@ public class GearProductionTaskServiceImpl implements IGearProductionTaskService task.setDelFlag("0"); } if (task.getStatus() == null || String.valueOf(task.getStatus()).trim().isEmpty()) { - task.setStatus("1"); + task.setStatus("0"); } + String username = LoginHelper.getUsername(); + task.setCreateBy(username); + task.setUpdateBy(username); task.setCreateTime(DateUtils.getNowDate()); task.setUpdateTime(DateUtils.getNowDate()); taskMapper.insertTask(task); @@ -131,7 +136,8 @@ public class GearProductionTaskServiceImpl implements IGearProductionTaskService if ("2".equals(String.valueOf(task.getStatus()))) { return true; } - int updated = taskMapper.updateTaskStatus(taskId, "2", task.getUpdateBy(), DateUtils.getNowDate()); + String username = LoginHelper.getUsername(); + int updated = taskMapper.updateTaskStatus(taskId, "2", username, DateUtils.getNowDate()); if (updated <= 0) { GearProductionTask after = taskMapper.selectTaskById(taskId); return after != null && "2".equals(String.valueOf(after.getStatus())); @@ -140,6 +146,159 @@ public class GearProductionTaskServiceImpl implements IGearProductionTaskService return true; } + @Override + @Transactional(rollbackFor = Exception.class) + public boolean uncompleteTask(Long taskId) { + if (taskId == null) { + return false; + } + GearProductionTask task = taskMapper.selectTaskById(taskId); + if (task == null) { + return false; + } + if (!"2".equals(String.valueOf(task.getStatus()))) { + return true; + } + String username = LoginHelper.getUsername(); + int updated = taskMapper.updateTaskStatus(taskId, "1", username, DateUtils.getNowDate()); + if (updated <= 0) { + GearProductionTask after = taskMapper.selectTaskById(taskId); + return after != null && !"2".equals(String.valueOf(after.getStatus())); + } + materialMapper.deleteByTaskId(taskId); + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean startTask(Long taskId) { + return setStatus(taskId, "1"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean pauseTask(Long taskId) { + return setStatus(taskId, "3"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean resumeTask(Long taskId) { + return setStatus(taskId, "1"); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean updateTaskWithDetail(GearProductionTaskWithDetailVo bo) { + if (bo == null || bo.getTask() == null || bo.getTask().getTaskId() == null) { + return false; + } + Long taskId = bo.getTask().getTaskId(); + GearProductionTask existed = taskMapper.selectTaskById(taskId); + if (existed == null) { + return false; + } + GearProductionTask task = bo.getTask(); + task.setStatus(existed.getStatus()); + task.setDelFlag(existed.getDelFlag()); + task.setUpdateBy(LoginHelper.getUsername()); + task.setUpdateTime(DateUtils.getNowDate()); + taskMapper.updateTask(task); + + Map existingProducts = new LinkedHashMap<>(); + List existList = productMapper.selectByTaskId(taskId); + if (existList != null) { + existList.forEach(p -> { + if (p != null && p.getProductId() != null) { + existingProducts.put(p.getProductId(), p); + } + }); + } + + productMapper.deleteByTaskId(taskId); + List rows = mergeProductsForSave(taskId, bo.getProducts(), existingProducts); + if (!rows.isEmpty()) { + productMapper.insertBatch(rows); + } + if ("2".equals(String.valueOf(existed.getStatus()))) { + regenerateReceiptMaterials(taskId); + } + return true; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean deleteTask(Long taskId) { + if (taskId == null) { + return false; + } + String username = LoginHelper.getUsername(); + int updated = taskMapper.updateDelFlag(taskId, "1", username, DateUtils.getNowDate()); + if (updated <= 0) { + return false; + } + return true; + } + + private boolean setStatus(Long taskId, String targetStatus) { + if (taskId == null) { + return false; + } + GearProductionTask task = taskMapper.selectTaskById(taskId); + if (task == null) { + return false; + } + if (targetStatus.equals(String.valueOf(task.getStatus()))) { + return true; + } + if ("2".equals(String.valueOf(task.getStatus())) && !"2".equals(targetStatus)) { + return false; + } + String username = LoginHelper.getUsername(); + int updated = taskMapper.updateTaskStatus(taskId, targetStatus, username, DateUtils.getNowDate()); + if (updated <= 0) { + GearProductionTask after = taskMapper.selectTaskById(taskId); + return after != null && targetStatus.equals(String.valueOf(after.getStatus())); + } + return true; + } + + private List mergeProductsForSave(Long taskId, + List incoming, + Map existed) { + Map map = new LinkedHashMap<>(); + if (incoming != null) { + incoming.forEach(p -> { + if (p == null || p.getProductId() == null) return; + GearProductionTaskProduct hit = map.get(p.getProductId()); + BigDecimal planQty = p.getPlanQty() == null ? BigDecimal.ZERO : p.getPlanQty(); + if (hit == null) { + GearProductionTaskProduct row = new GearProductionTaskProduct(); + row.setLineId(IdUtil.getSnowflakeNextId()); + row.setTaskId(taskId); + row.setProductId(p.getProductId()); + row.setPlanQty(planQty); + GearProductionTaskProductVo old = existed != null ? existed.get(p.getProductId()) : null; + row.setFinishedQty(old != null && old.getFinishedQty() != null ? old.getFinishedQty() : BigDecimal.ZERO); + row.setBadQty(old != null && old.getBadQty() != null ? old.getBadQty() : BigDecimal.ZERO); + String unit = (p.getUnit() != null && !p.getUnit().trim().isEmpty()) ? p.getUnit() : (old != null ? old.getUnit() : null); + row.setUnit(unit); + row.setRemark(p.getRemark()); + map.put(p.getProductId(), row); + return; + } + hit.setPlanQty((hit.getPlanQty() == null ? BigDecimal.ZERO : hit.getPlanQty()).add(planQty)); + if ((hit.getUnit() == null || hit.getUnit().trim().isEmpty()) && p.getUnit() != null && !p.getUnit().trim().isEmpty()) { + hit.setUnit(p.getUnit()); + } + if ((hit.getRemark() == null || hit.getRemark().trim().isEmpty()) && p.getRemark() != null && !p.getRemark().trim().isEmpty()) { + hit.setRemark(p.getRemark()); + } + }); + } + return new ArrayList<>(map.values()); + } + private void regenerateReceiptMaterials(Long taskId) { materialMapper.deleteByTaskId(taskId); List required = materialMapper.selectRequirementByTaskId(taskId); diff --git a/gear-mes/src/main/resources/mapper/production/GearProductionTaskMapper.xml b/gear-mes/src/main/resources/mapper/production/GearProductionTaskMapper.xml index 321eddd..22b4507 100644 --- a/gear-mes/src/main/resources/mapper/production/GearProductionTaskMapper.xml +++ b/gear-mes/src/main/resources/mapper/production/GearProductionTaskMapper.xml @@ -121,4 +121,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND status ]]> #{status} + + UPDATE gear_production_task + SET + del_flag = #{delFlag}, + update_by = #{updateBy}, + update_time = #{updateTime} + WHERE task_id = #{taskId} + AND del_flag = '0' + + diff --git a/gear-oa/src/main/java/com/gear/oa/controller/GearContractController.java b/gear-oa/src/main/java/com/gear/oa/controller/GearContractController.java new file mode 100644 index 0000000..74664b8 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/controller/GearContractController.java @@ -0,0 +1,71 @@ +package com.gear.oa.controller; + +import com.gear.common.annotation.Log; +import com.gear.common.annotation.RepeatSubmit; +import com.gear.common.core.controller.BaseController; +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.domain.R; +import com.gear.common.core.page.TableDataInfo; +import com.gear.common.core.validate.AddGroup; +import com.gear.common.core.validate.EditGroup; +import com.gear.common.enums.BusinessType; +import com.gear.common.utils.poi.ExcelUtil; +import com.gear.oa.domain.bo.GearContractBo; +import com.gear.oa.domain.vo.GearContractVo; +import com.gear.oa.service.IGearContractService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/contract") +public class GearContractController extends BaseController { + + private final IGearContractService iGearContractService; + + @GetMapping("/list") + public TableDataInfo list(GearContractBo bo, PageQuery pageQuery) { + return iGearContractService.queryPageList(bo, pageQuery); + } + + @Log(title = "合同编辑详情", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(GearContractBo bo, HttpServletResponse response) { + List list = iGearContractService.queryList(bo); + ExcelUtil.exportExcel(list, "合同编辑详情", GearContractVo.class, response); + } + + @GetMapping("/{contractId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long contractId) { + return R.ok(iGearContractService.queryById(contractId)); + } + + @Log(title = "合同编辑详情", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody GearContractBo bo) { + return toAjax(iGearContractService.insertByBo(bo)); + } + + @Log(title = "合同编辑详情", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody GearContractBo bo) { + return toAjax(iGearContractService.updateByBo(bo)); + } + + @Log(title = "合同编辑详情", businessType = BusinessType.DELETE) + @DeleteMapping("/{contractIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] contractIds) { + return toAjax(iGearContractService.deleteWithValidByIds(Arrays.asList(contractIds), true)); + } +} + diff --git a/gear-oa/src/main/java/com/gear/oa/domain/GearContract.java b/gear-oa/src/main/java/com/gear/oa/domain/GearContract.java new file mode 100644 index 0000000..cca1d01 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/GearContract.java @@ -0,0 +1,45 @@ +package com.gear.oa.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.gear.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gear_contract") +public class GearContract extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "contract_id") + private Long contractId; + + private String contractNo; + + private String partyA; + + private String partyB; + + private String effectiveFlag; + + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date signDate; + + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date deliveryDate; + + private String signPlace; + + private String partyAAddress; + + private String partyBAddress; + + @TableLogic(value = "0", delval = "2") + private String delFlag; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearContractBo.java b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearContractBo.java new file mode 100644 index 0000000..60a8fc4 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearContractBo.java @@ -0,0 +1,54 @@ +package com.gear.oa.domain.bo; + +import com.gear.common.core.domain.BaseEntity; +import com.gear.common.core.validate.AddGroup; +import com.gear.common.core.validate.EditGroup; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.Date; + +@Data +@EqualsAndHashCode(callSuper = true) +public class GearContractBo extends BaseEntity { + + @NotNull(message = "合同ID不能为空", groups = {EditGroup.class}) + private Long contractId; + + @NotBlank(message = "合同号不能为空", groups = {AddGroup.class, EditGroup.class}) + private String contractNo; + + private String partyA; + + private String partyB; + + private String effectiveFlag; + + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date signDate; + + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date deliveryDate; + + private String signPlace; + + private String partyAAddress; + + private String partyBAddress; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date signDateStart; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date signDateEnd; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date deliveryDateStart; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date deliveryDateEnd; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearContractVo.java b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearContractVo.java new file mode 100644 index 0000000..1cb095d --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearContractVo.java @@ -0,0 +1,49 @@ +package com.gear.oa.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.gear.common.core.domain.BaseEntity; +import lombok.Data; + +import java.util.Date; + +@Data +@ExcelIgnoreUnannotated +public class GearContractVo extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = "合同ID") + private Long contractId; + + @ExcelProperty(value = "合同号") + private String contractNo; + + @ExcelProperty(value = "甲方/供方") + private String partyA; + + @ExcelProperty(value = "乙方/需方") + private String partyB; + + @ExcelProperty(value = "是否生效") + private String effectiveFlag; + + @ExcelProperty(value = "签订日期") + private Date signDate; + + @ExcelProperty(value = "交货日期") + private Date deliveryDate; + + @ExcelProperty(value = "签订地点") + private String signPlace; + + @ExcelProperty(value = "甲方地址") + private String partyAAddress; + + @ExcelProperty(value = "乙方地址") + private String partyBAddress; + + @ExcelProperty(value = "备注") + private String remark; +} + diff --git a/gear-oa/src/main/java/com/gear/oa/mapper/GearContractMapper.java b/gear-oa/src/main/java/com/gear/oa/mapper/GearContractMapper.java new file mode 100644 index 0000000..260a74f --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/mapper/GearContractMapper.java @@ -0,0 +1,9 @@ +package com.gear.oa.mapper; + +import com.gear.common.core.mapper.BaseMapperPlus; +import com.gear.oa.domain.GearContract; +import com.gear.oa.domain.vo.GearContractVo; + +public interface GearContractMapper extends BaseMapperPlus { +} + diff --git a/gear-oa/src/main/java/com/gear/oa/service/IGearContractService.java b/gear-oa/src/main/java/com/gear/oa/service/IGearContractService.java new file mode 100644 index 0000000..eaa1723 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/IGearContractService.java @@ -0,0 +1,25 @@ +package com.gear.oa.service; + +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.page.TableDataInfo; +import com.gear.oa.domain.bo.GearContractBo; +import com.gear.oa.domain.vo.GearContractVo; + +import java.util.Collection; +import java.util.List; + +public interface IGearContractService { + + GearContractVo queryById(Long contractId); + + TableDataInfo queryPageList(GearContractBo bo, PageQuery pageQuery); + + List queryList(GearContractBo bo); + + Boolean insertByBo(GearContractBo bo); + + Boolean updateByBo(GearContractBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} + diff --git a/gear-oa/src/main/java/com/gear/oa/service/impl/GearContractServiceImpl.java b/gear-oa/src/main/java/com/gear/oa/service/impl/GearContractServiceImpl.java new file mode 100644 index 0000000..feac5ed --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/impl/GearContractServiceImpl.java @@ -0,0 +1,108 @@ +package com.gear.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.page.TableDataInfo; +import com.gear.common.utils.StringUtils; +import com.gear.oa.domain.GearContract; +import com.gear.oa.domain.bo.GearContractBo; +import com.gear.oa.domain.vo.GearContractVo; +import com.gear.oa.mapper.GearContractMapper; +import com.gear.oa.service.IGearContractService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +@RequiredArgsConstructor +@Service +public class GearContractServiceImpl implements IGearContractService { + + private final GearContractMapper baseMapper; + + @Override + public GearContractVo queryById(Long contractId) { + return baseMapper.selectVoById(contractId); + } + + @Override + public TableDataInfo queryPageList(GearContractBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(GearContractBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(GearContractBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getContractId() != null, GearContract::getContractId, bo.getContractId()); + lqw.like(StringUtils.isNotBlank(bo.getContractNo()), GearContract::getContractNo, bo.getContractNo()); + lqw.like(StringUtils.isNotBlank(bo.getPartyA()), GearContract::getPartyA, bo.getPartyA()); + lqw.like(StringUtils.isNotBlank(bo.getPartyB()), GearContract::getPartyB, bo.getPartyB()); + lqw.eq(StringUtils.isNotBlank(bo.getEffectiveFlag()), GearContract::getEffectiveFlag, bo.getEffectiveFlag()); + lqw.like(StringUtils.isNotBlank(bo.getSignPlace()), GearContract::getSignPlace, bo.getSignPlace()); + lqw.ge(bo.getSignDateStart() != null, GearContract::getSignDate, bo.getSignDateStart()); + lqw.le(bo.getSignDateEnd() != null, GearContract::getSignDate, bo.getSignDateEnd()); + lqw.ge(bo.getDeliveryDateStart() != null, GearContract::getDeliveryDate, bo.getDeliveryDateStart()); + lqw.le(bo.getDeliveryDateEnd() != null, GearContract::getDeliveryDate, bo.getDeliveryDateEnd()); + lqw.orderByDesc(GearContract::getSignDate); + lqw.orderByDesc(GearContract::getCreateTime); + return lqw; + } + + @Override + public Boolean insertByBo(GearContractBo bo) { + GearContract add = BeanUtil.toBean(bo, GearContract.class); + validEntityBeforeSave(add); + boolean ok = baseMapper.insert(add) > 0; + if (ok) { + bo.setContractId(add.getContractId()); + } + return ok; + } + + @Override + public Boolean updateByBo(GearContractBo bo) { + GearContract update = BeanUtil.toBean(bo, GearContract.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + private void validEntityBeforeSave(GearContract entity) { + boolean isInsert = entity.getContractId() == null; + if (entity.getContractId() == null) { + entity.setContractId(IdUtil.getSnowflakeNextId()); + } + if (StringUtils.isBlank(entity.getContractNo())) { + entity.setContractNo("CON_" + IdUtil.getSnowflakeNextIdStr()); + } + if (StringUtils.isBlank(entity.getEffectiveFlag())) { + entity.setEffectiveFlag("0"); + } + if (isInsert) { + if (StringUtils.isBlank(entity.getDelFlag())) { + entity.setDelFlag("0"); + } + } + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} + diff --git a/gear-ui3/src/api/mes/productionTask.js b/gear-ui3/src/api/mes/productionTask.js index ee06999..5de8869 100644 --- a/gear-ui3/src/api/mes/productionTask.js +++ b/gear-ui3/src/api/mes/productionTask.js @@ -29,3 +29,46 @@ export function completeProductionTask(taskId) { method: 'post' }) } + +export function uncompleteProductionTask(taskId) { + return request({ + url: '/mes/production/task/' + taskId + '/uncomplete', + method: 'post' + }) +} + +export function startProductionTask(taskId) { + return request({ + url: '/mes/production/task/' + taskId + '/start', + method: 'post' + }) +} + +export function pauseProductionTask(taskId) { + return request({ + url: '/mes/production/task/' + taskId + '/pause', + method: 'post' + }) +} + +export function resumeProductionTask(taskId) { + return request({ + url: '/mes/production/task/' + taskId + '/resume', + method: 'post' + }) +} + +export function updateProductionTask(data) { + return request({ + url: '/mes/production/task', + method: 'put', + data + }) +} + +export function deleteProductionTask(taskId) { + return request({ + url: '/mes/production/task/' + taskId, + method: 'delete' + }) +} diff --git a/gear-ui3/src/api/oms/contract.js b/gear-ui3/src/api/oms/contract.js new file mode 100644 index 0000000..dba93af --- /dev/null +++ b/gear-ui3/src/api/oms/contract.js @@ -0,0 +1,40 @@ +import request from '@/utils/request' + +export function listContract(query) { + return request({ + url: '/oa/contract/list', + method: 'get', + params: query + }) +} + +export function getContract(contractId) { + return request({ + url: '/oa/contract/' + contractId, + method: 'get' + }) +} + +export function addContract(data) { + return request({ + url: '/oa/contract', + method: 'post', + data: data + }) +} + +export function updateContract(data) { + return request({ + url: '/oa/contract', + method: 'put', + data: data + }) +} + +export function delContract(contractId) { + return request({ + url: '/oa/contract/' + contractId, + method: 'delete' + }) +} + diff --git a/gear-ui3/src/views/mes/production/index.vue b/gear-ui3/src/views/mes/production/index.vue index 5a3f299..e2e2c09 100644 --- a/gear-ui3/src/views/mes/production/index.vue +++ b/gear-ui3/src/views/mes/production/index.vue @@ -49,6 +49,7 @@ + @@ -101,7 +102,7 @@
计划 {{ formatTimeRange(t.planStartTime, t.planEndTime) }} 创建 {{ t.createBy }} - 更新 {{ formatTime(t.updateTime) }} + 状态 {{ statusLabel(t.status) }} {{ formatTime(t.updateTime) }}
@@ -120,15 +121,15 @@ {{ selectedTask.taskName || selectedTask.taskCode || ('任务' + selectedTask.taskId) }} {{ statusLabel(selectedTask.status) }} - - 完成任务 - +
+ 开始 + 暂停 + 继续 + 完成 + 撤销完成 + 编辑 + 删除 +
@@ -225,8 +226,8 @@ + - @@ -288,12 +289,83 @@ 保存 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 生产产品明细 +
+ 新增产品行 +
+ + + + + + + + + + + + + + + + + + + +
+ + diff --git a/gear-ui3/src/views/system/user/index.vue b/gear-ui3/src/views/system/user/index.vue index 5e01928..597eb30 100644 --- a/gear-ui3/src/views/system/user/index.vue +++ b/gear-ui3/src/views/system/user/index.vue @@ -500,21 +500,26 @@ function handleAdd() { /** 修改按钮操作 */ function handleUpdate(row) { reset() - const userId = row.userId || ids.value - // let userId - // if (row && row.userId) { - // userId = row.userId - // } else if (ids.value && ids.value.length > 0) { - // userId = ids.value[0] - // } else { - // return - // } + let userId + if (row && row.userId) { + userId = row.userId + } else if (ids.value && ids.value.length > 0) { + userId = ids.value[0] + } else { + return + } getUser(userId).then(response => { - form.value = response.data - postOptions.value = response.data.posts - roleOptions.value = response.data.roles - form.value.postIds = response.data.postIds - form.value.roleIds = response.data.roleIds + const data = response && response.data ? response.data : {} + const user = data.user ? data.user : {} + form.value = { + ...form.value, + ...user, + deptId: user.deptId != null ? Number(user.deptId) : undefined, + postIds: Array.isArray(data.postIds) ? data.postIds.map((v) => Number(v)) : [], + roleIds: Array.isArray(data.roleIds) ? data.roleIds.map((v) => Number(v)) : [] + } + postOptions.value = data.posts || [] + roleOptions.value = data.roles || [] open.value = true title.value = "修改用户" form.value.password = "" diff --git a/script/sql/mysql/item/gear_contract.sql b/script/sql/mysql/item/gear_contract.sql new file mode 100644 index 0000000..126aa6c --- /dev/null +++ b/script/sql/mysql/item/gear_contract.sql @@ -0,0 +1,35 @@ +-- ================================ +-- 合同编辑(用于“销售管理 -> 合同编辑详情”) +-- 目标:提供合同基础信息维护与快速编辑能力(列表行内修改/保存) +-- 说明: +-- 1) 单表存储合同主信息;与订单/客户关系后续可扩展 +-- 2) 逻辑删除使用 del_flag(0存在 2删除) +-- ================================ + +DROP TABLE IF EXISTS gear_contract; +CREATE TABLE gear_contract ( + contract_id bigint(20) NOT NULL COMMENT '合同ID', + contract_no varchar(64) NOT NULL COMMENT '合同号(唯一)', + party_a varchar(255) DEFAULT '' COMMENT '甲方/供方', + party_b varchar(255) DEFAULT '' COMMENT '乙方/需方', + effective_flag char(1) NOT NULL DEFAULT '0' COMMENT '是否生效(0否 1是)', + sign_date date COMMENT '签订日期', + delivery_date date COMMENT '交货日期', + sign_place varchar(255) DEFAULT '' COMMENT '签订地点', + party_a_address varchar(255) DEFAULT '' COMMENT '甲方地址', + party_b_address varchar(255) DEFAULT '' COMMENT '乙方地址', + remark varchar(500) DEFAULT NULL COMMENT '备注', + del_flag char(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0存在 2删除)', + create_by varchar(64) DEFAULT '' COMMENT '创建者', + create_time datetime COMMENT '创建时间', + update_by varchar(64) DEFAULT '' COMMENT '更新者', + update_time datetime COMMENT '更新时间', + PRIMARY KEY (contract_id), + UNIQUE KEY uk_contract_no (contract_no), + KEY idx_sign_date (sign_date), + KEY idx_delivery_date (delivery_date), + KEY idx_effective_flag (effective_flag), + KEY idx_party_a (party_a), + KEY idx_party_b (party_b) +) ENGINE=InnoDB COMMENT='合同表(编辑详情)'; + diff --git a/script/sql/mysql/item/sys_menu.sql b/script/sql/mysql/item/sys_menu.sql index cbf10b4..4170874 100644 --- a/script/sql/mysql/item/sys_menu.sql +++ b/script/sql/mysql/item/sys_menu.sql @@ -204,3 +204,5 @@ INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path` INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (2041777949048430593, '工人管理', 1952975318515830785, 21, 'worker', 'oms/worker/index', NULL, 1, 0, 'C', '0', '0', NULL, 'user', 'admin', '2026-04-08 15:19:32', 'admin', '2026-04-13 16:32:20', ''); INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (2041786163248885761, '薪资录入', 1952975318515830785, 97, 'wageEntryDetail', 'oms/wageEntryDetail/index', NULL, 1, 0, 'C', '0', '0', NULL, 'edit', 'admin', '2026-04-08 15:52:11', 'admin', '2026-04-08 15:52:11', ''); INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (2041816674390265858, '薪资补录', 1952975318515830785, 98, 'wageMakeup', 'oms/wageMakeup/index', NULL, 1, 0, 'C', '0', '0', NULL, 'edit', 'admin', '2026-04-08 17:53:25', 'admin', '2026-04-08 17:53:25', ''); +INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (2060000000000000001, '合同编辑', 1962721165348478977, 8, 'contract', NULL, NULL, 1, 0, 'M', '0', '0', NULL, 'edit', 'admin', '2026-05-28 10:00:00', 'admin', '2026-05-28 10:00:00', ''); +INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (2060000000000000002, '合同编辑详情', 2060000000000000001, 1, 'editDetail', 'oms/contractEdit/index', NULL, 1, 0, 'C', '0', '0', NULL, 'table', 'admin', '2026-05-28 10:00:00', 'admin', '2026-05-28 10:00:00', '');