From 2ca6a271db05e29e52a591f3e43a3d6b6d377364 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: Thu, 4 Jun 2026 14:45:26 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E6=98=8E=E7=BB=86=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E9=A1=B5=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GearContractDetailController.java | 57 ++++ .../gear/oa/domain/GearContractDetail.java | 45 +++ .../oa/domain/bo/GearContractDetailBo.java | 46 +++ .../oa/domain/vo/GearContractDetailVo.java | 65 +++++ .../oa/mapper/GearContractDetailMapper.java | 13 + .../service/IGearContractDetailService.java | 21 ++ .../impl/GearContractDetailServiceImpl.java | 75 +++++ .../mapper/oa/GearContractDetailMapper.xml | 21 ++ gear-ui3/src/api/oms/contractDetail.js | 25 ++ .../src/views/oms/contractDetail/index.vue | 266 ++++++++++++++++++ .../sql/mysql/item/gear_contract_detail.sql | 32 +++ script/sql/mysql/item/sys_menu.sql | 1 + 12 files changed, 667 insertions(+) create mode 100644 gear-oa/src/main/java/com/gear/oa/controller/GearContractDetailController.java create mode 100644 gear-oa/src/main/java/com/gear/oa/domain/GearContractDetail.java create mode 100644 gear-oa/src/main/java/com/gear/oa/domain/bo/GearContractDetailBo.java create mode 100644 gear-oa/src/main/java/com/gear/oa/domain/vo/GearContractDetailVo.java create mode 100644 gear-oa/src/main/java/com/gear/oa/mapper/GearContractDetailMapper.java create mode 100644 gear-oa/src/main/java/com/gear/oa/service/IGearContractDetailService.java create mode 100644 gear-oa/src/main/java/com/gear/oa/service/impl/GearContractDetailServiceImpl.java create mode 100644 gear-oa/src/main/resources/mapper/oa/GearContractDetailMapper.xml create mode 100644 gear-ui3/src/api/oms/contractDetail.js create mode 100644 gear-ui3/src/views/oms/contractDetail/index.vue create mode 100644 script/sql/mysql/item/gear_contract_detail.sql diff --git a/gear-oa/src/main/java/com/gear/oa/controller/GearContractDetailController.java b/gear-oa/src/main/java/com/gear/oa/controller/GearContractDetailController.java new file mode 100644 index 0000000..38d9dd5 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/controller/GearContractDetailController.java @@ -0,0 +1,57 @@ +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.EditGroup; +import com.gear.common.enums.BusinessType; +import com.gear.common.utils.poi.ExcelUtil; +import com.gear.oa.domain.bo.GearContractDetailBo; +import com.gear.oa.domain.vo.GearContractDetailVo; +import com.gear.oa.service.IGearContractDetailService; +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 java.util.Arrays; +import java.util.List; + +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/contractDetail") +public class GearContractDetailController extends BaseController { + + private final IGearContractDetailService iGearContractDetailService; + + @GetMapping("/list") + public TableDataInfo list(GearContractDetailBo bo, PageQuery pageQuery) { + return iGearContractDetailService.queryPageList(bo, pageQuery); + } + + @Log(title = "订单明细列表", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(GearContractDetailBo bo, HttpServletResponse response) { + List list = iGearContractDetailService.queryList(bo); + ExcelUtil.exportExcel(list, "订单明细列表", GearContractDetailVo.class, response); + } + + @Log(title = "订单明细列表", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody GearContractDetailBo bo) { + return toAjax(iGearContractDetailService.updateByBo(bo)); + } + + @Log(title = "订单明细列表", businessType = BusinessType.DELETE) + @DeleteMapping("/{detailIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] detailIds) { + return toAjax(iGearContractDetailService.deleteWithValidByIds(Arrays.asList(detailIds), true)); + } +} + diff --git a/gear-oa/src/main/java/com/gear/oa/domain/GearContractDetail.java b/gear-oa/src/main/java/com/gear/oa/domain/GearContractDetail.java new file mode 100644 index 0000000..9ab29e6 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/GearContractDetail.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.gear.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gear_contract_detail") +public class GearContractDetail extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "detail_id") + private Long detailId; + + private Long contractId; + + private Integer lineNo; + + private String productName; + + private String spec; + + private String material; + + private BigDecimal widthMm; + + private BigDecimal thicknessMm; + + private String surfaceTreatment; + + private String packagingRequirement; + + private String remark; + + @TableLogic(value = "0", delval = "2") + private String delFlag; +} + diff --git a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearContractDetailBo.java b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearContractDetailBo.java new file mode 100644 index 0000000..9f6f691 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearContractDetailBo.java @@ -0,0 +1,46 @@ +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 lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +@Data +@EqualsAndHashCode(callSuper = true) +public class GearContractDetailBo extends BaseEntity { + + @NotNull(message = "明细ID不能为空", groups = {EditGroup.class}) + private Long detailId; + + @NotNull(message = "合同ID不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long contractId; + + private Integer lineNo; + + private String contractNo; + + private String partyA; + + private String partyB; + + private String effectiveFlag; + + private String productName; + + private String spec; + + private String material; + + private BigDecimal widthMm; + + private BigDecimal thicknessMm; + + private String surfaceTreatment; + + private String packagingRequirement; +} + diff --git a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearContractDetailVo.java b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearContractDetailVo.java new file mode 100644 index 0000000..fd2df39 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearContractDetailVo.java @@ -0,0 +1,65 @@ +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.math.BigDecimal; +import java.util.Date; + +@Data +@ExcelIgnoreUnannotated +public class GearContractDetailVo extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = "明细ID") + private Long detailId; + + @ExcelProperty(value = "合同ID") + private Long contractId; + + @ExcelProperty(value = "合同号") + private String contractNo; + + @ExcelProperty(value = "供方") + private String partyA; + + @ExcelProperty(value = "需方") + private String partyB; + + @ExcelProperty(value = "签订日期") + private Date signDate; + + @ExcelProperty(value = "交货日期") + private Date deliveryDate; + + @ExcelProperty(value = "序号") + private Integer lineNo; + + @ExcelProperty(value = "产品名称") + private String productName; + + @ExcelProperty(value = "规格") + private String spec; + + @ExcelProperty(value = "材质") + private String material; + + @ExcelProperty(value = "宽度(mm)") + private BigDecimal widthMm; + + @ExcelProperty(value = "厚度(mm)") + private BigDecimal thicknessMm; + + @ExcelProperty(value = "表面处理") + private String surfaceTreatment; + + @ExcelProperty(value = "包装要求") + private String packagingRequirement; + + @ExcelProperty(value = "备注") + private String remark; +} + diff --git a/gear-oa/src/main/java/com/gear/oa/mapper/GearContractDetailMapper.java b/gear-oa/src/main/java/com/gear/oa/mapper/GearContractDetailMapper.java new file mode 100644 index 0000000..ffcda58 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/mapper/GearContractDetailMapper.java @@ -0,0 +1,13 @@ +package com.gear.oa.mapper; + +import com.gear.common.core.mapper.BaseMapperPlus; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import com.gear.oa.domain.GearContractDetail; +import com.gear.oa.domain.vo.GearContractDetailVo; + +public interface GearContractDetailMapper extends BaseMapperPlus { + + Page selectVoPagePlus(Page page, @Param("ew") Wrapper wrapper); +} diff --git a/gear-oa/src/main/java/com/gear/oa/service/IGearContractDetailService.java b/gear-oa/src/main/java/com/gear/oa/service/IGearContractDetailService.java new file mode 100644 index 0000000..10aeb8b --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/IGearContractDetailService.java @@ -0,0 +1,21 @@ +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.GearContractDetailBo; +import com.gear.oa.domain.vo.GearContractDetailVo; + +import java.util.Collection; +import java.util.List; + +public interface IGearContractDetailService { + + TableDataInfo queryPageList(GearContractDetailBo bo, PageQuery pageQuery); + + List queryList(GearContractDetailBo bo); + + Boolean updateByBo(GearContractDetailBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} + diff --git a/gear-oa/src/main/java/com/gear/oa/service/impl/GearContractDetailServiceImpl.java b/gear-oa/src/main/java/com/gear/oa/service/impl/GearContractDetailServiceImpl.java new file mode 100644 index 0000000..0e5124a --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/impl/GearContractDetailServiceImpl.java @@ -0,0 +1,75 @@ +package com.gear.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +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.GearContractDetail; +import com.gear.oa.domain.bo.GearContractDetailBo; +import com.gear.oa.domain.vo.GearContractDetailVo; +import com.gear.oa.mapper.GearContractDetailMapper; +import com.gear.oa.service.IGearContractDetailService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +@RequiredArgsConstructor +@Service +public class GearContractDetailServiceImpl implements IGearContractDetailService { + + private final GearContractDetailMapper baseMapper; + + @Override + public TableDataInfo queryPageList(GearContractDetailBo bo, PageQuery pageQuery) { + QueryWrapper qw = buildQueryWrapperPlus(bo); + Page result = baseMapper.selectVoPagePlus(pageQuery.build(), qw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(GearContractDetailBo bo) { + QueryWrapper qw = buildQueryWrapperPlus(bo); + return baseMapper.selectVoList(qw); + } + + private QueryWrapper buildQueryWrapperPlus(GearContractDetailBo bo) { + Map params = bo.getParams(); + QueryWrapper qw = Wrappers.query(); + qw.eq("d.del_flag", "0"); + qw.eq(bo.getContractId() != null, "d.contract_id", bo.getContractId()); + qw.eq(bo.getLineNo() != null, "d.line_no", bo.getLineNo()); + qw.like(StringUtils.isNotBlank(bo.getProductName()), "d.product_name", bo.getProductName()); + qw.like(StringUtils.isNotBlank(bo.getSpec()), "d.spec", bo.getSpec()); + qw.like(StringUtils.isNotBlank(bo.getMaterial()), "d.material", bo.getMaterial()); + qw.like(StringUtils.isNotBlank(bo.getSurfaceTreatment()), "d.surface_treatment", bo.getSurfaceTreatment()); + qw.like(StringUtils.isNotBlank(bo.getPackagingRequirement()), "d.packaging_requirement", bo.getPackagingRequirement()); + + qw.like(StringUtils.isNotBlank(bo.getContractNo()), "c.contract_no", bo.getContractNo()); + qw.like(StringUtils.isNotBlank(bo.getPartyA()), "c.party_a", bo.getPartyA()); + qw.like(StringUtils.isNotBlank(bo.getPartyB()), "c.party_b", bo.getPartyB()); + qw.eq(StringUtils.isNotBlank(bo.getEffectiveFlag()), "c.effective_flag", bo.getEffectiveFlag()); + qw.orderByAsc("d.contract_id"); + qw.orderByAsc("d.line_no"); + return qw; + } + + @Override + public Boolean updateByBo(GearContractDetailBo bo) { + GearContractDetail update = BeanUtil.toBean(bo, GearContractDetail.class); + return baseMapper.updateById(update) > 0; + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} + diff --git a/gear-oa/src/main/resources/mapper/oa/GearContractDetailMapper.xml b/gear-oa/src/main/resources/mapper/oa/GearContractDetailMapper.xml new file mode 100644 index 0000000..4bcfbfa --- /dev/null +++ b/gear-oa/src/main/resources/mapper/oa/GearContractDetailMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + diff --git a/gear-ui3/src/api/oms/contractDetail.js b/gear-ui3/src/api/oms/contractDetail.js new file mode 100644 index 0000000..10634f7 --- /dev/null +++ b/gear-ui3/src/api/oms/contractDetail.js @@ -0,0 +1,25 @@ +import request from '@/utils/request' + +export function listContractDetail(query) { + return request({ + url: '/oa/contractDetail/list', + method: 'get', + params: query + }) +} + +export function updateContractDetail(data) { + return request({ + url: '/oa/contractDetail', + method: 'put', + data: data + }) +} + +export function delContractDetail(detailId) { + return request({ + url: '/oa/contractDetail/' + detailId, + method: 'delete' + }) +} + diff --git a/gear-ui3/src/views/oms/contractDetail/index.vue b/gear-ui3/src/views/oms/contractDetail/index.vue new file mode 100644 index 0000000..e4dbb8d --- /dev/null +++ b/gear-ui3/src/views/oms/contractDetail/index.vue @@ -0,0 +1,266 @@ + + + + + + diff --git a/script/sql/mysql/item/gear_contract_detail.sql b/script/sql/mysql/item/gear_contract_detail.sql new file mode 100644 index 0000000..ddc87eb --- /dev/null +++ b/script/sql/mysql/item/gear_contract_detail.sql @@ -0,0 +1,32 @@ +-- ================================ +-- 订单明细列表(用于“销售管理 -> 合同管理 -> 订单明细列表”) +-- 目标:按合同维度维护订单/合同的产品明细(可行内编辑并保存) +-- 说明: +-- 1) 明细表通过 contract_id 关联 gear_contract +-- 2) 逻辑删除使用 del_flag(0存在 2删除) +-- ================================ + +DROP TABLE IF EXISTS gear_contract_detail; +CREATE TABLE gear_contract_detail ( + detail_id bigint(20) NOT NULL COMMENT '明细ID', + contract_id bigint(20) NOT NULL COMMENT '合同ID gear_contract.contract_id', + line_no int NOT NULL DEFAULT 1 COMMENT '序号', + product_name varchar(255) DEFAULT '' COMMENT '产品名称(快照/可编辑)', + spec varchar(255) DEFAULT '' COMMENT '规格(快照/可编辑)', + material varchar(255) DEFAULT '' COMMENT '材质(可编辑)', + width_mm decimal(18,4) DEFAULT 0 COMMENT '宽度(mm)', + thickness_mm decimal(18,4) DEFAULT 0 COMMENT '厚度(mm)', + surface_treatment varchar(255) DEFAULT '' COMMENT '表面处理(可编辑)', + packaging_requirement varchar(500) 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 (detail_id), + KEY idx_contract_id (contract_id), + KEY idx_line_no (line_no), + KEY idx_product_name (product_name(32)) +) ENGINE=InnoDB COMMENT='合同订单明细表(订单明细列表)'; + diff --git a/script/sql/mysql/item/sys_menu.sql b/script/sql/mysql/item/sys_menu.sql index 4170874..4423c73 100644 --- a/script/sql/mysql/item/sys_menu.sql +++ b/script/sql/mysql/item/sys_menu.sql @@ -206,3 +206,4 @@ 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 (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', ''); +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 (2060000000000000003, '订单明细列表', 2060000000000000001, 2, 'orderDetailList', 'oms/contractDetail/index', NULL, 1, 0, 'C', '0', '0', NULL, 'table', 'admin', '2026-05-28 10:00:00', 'admin', '2026-05-28 10:00:00', '');