Compare commits
208 Commits
e767502d7b
...
0.8.X
| Author | SHA1 | Date | |
|---|---|---|---|
| fc203acd68 | |||
| c60ed8eb86 | |||
| 7229b23fcd | |||
| 54bdf600df | |||
| a8e667a69b | |||
| ba613bb88d | |||
| e44235abd8 | |||
| fecfb977e8 | |||
| bd9beb32eb | |||
| c571b12463 | |||
| a2067815a9 | |||
| b160b86838 | |||
| 626aca5b85 | |||
| e22648bff0 | |||
| 5adc316854 | |||
|
|
d61a2c795b | ||
|
|
f501994da6 | ||
|
|
62b594026b | ||
| ee199388d5 | |||
| d69e445e82 | |||
| 3d7fd09c60 | |||
| 5634964002 | |||
| 9f7870c63b | |||
| 29d0303247 | |||
| c3bef9615e | |||
| d398c2e4fc | |||
| 2dbf4a042e | |||
| be59e4cc79 | |||
| 14e28a0169 | |||
| a26089ce15 | |||
| 2d3caa65bc | |||
| bd4d591934 | |||
| f7a8b3df22 | |||
| 4fefc68bbc | |||
| cdcf5e2428 | |||
| deb684ce27 | |||
| 3f300e05e9 | |||
| af002b84d3 | |||
| 143764f7f8 | |||
| 0822ca7cc8 | |||
| 5b452bad31 | |||
| 4f259c5aba | |||
| 34dd8004c4 | |||
| 254dada485 | |||
| ee2bb280b6 | |||
| 96082b9124 | |||
| ddb1beb629 | |||
| 67cf5aa7cb | |||
| e1cc0fda34 | |||
| 4e5e1bbca1 | |||
| 2e363f9ad8 | |||
| f158830abf | |||
| 843512ab7e | |||
| dd27069b4c | |||
| b95bd5b93d | |||
| 4d588985e8 | |||
| 3ad3fd2fee | |||
| 79ee9d572d | |||
| c9742b08cf | |||
| 6bd5d2ded3 | |||
| da1813e65a | |||
| 8dbb7d1113 | |||
| ae77c529ae | |||
| edcbf7a5f1 | |||
| 28622a2b16 | |||
| 44303cb1c7 | |||
| c0f7c699a8 | |||
| e69dc5e76e | |||
| ec0660acba | |||
| 110597657e | |||
| 50670b64d8 | |||
|
|
823afd7a00 | ||
|
|
344488f08e | ||
| c2da7640c3 | |||
| e99d7709d2 | |||
| 623e78629d | |||
| c1938e29a4 | |||
| 54d426984b | |||
|
|
440e70ee82 | ||
|
|
220a24da78 | ||
| c31dc4948e | |||
| 7b55f358b4 | |||
| 2fcc7b3279 | |||
|
|
8e5ce5c119 | ||
|
|
ee275d3ea5 | ||
|
|
5e80208d61 | ||
| 05f0933514 | |||
| ec5da2a7ca | |||
| 7d6957165d | |||
| 31648431c8 | |||
|
|
36ff376c55 | ||
|
|
f68167b102 | ||
| 671a7e129f | |||
| 84a0cb43ee | |||
|
|
d15f57ae6d | ||
|
|
b32f826488 | ||
|
|
a99126a9a3 | ||
| 6e5b9fc962 | |||
| c9a93fe942 | |||
|
|
5f5e5cacb4 | ||
|
|
263c2b5f37 | ||
| 910ec2b22f | |||
| a62ef2d0b0 | |||
| 31d44c19ca | |||
| fea3c78c4f | |||
|
|
8de4042bdf | ||
|
|
54bea01416 | ||
|
|
9f3d402174 | ||
| c3d6d7cece | |||
|
|
37dc213605 | ||
|
|
5ee730bffa | ||
|
|
116d79e7c2 | ||
|
|
4c373e6af5 | ||
|
|
4beaf79fd6 | ||
| b4dc0ed9e4 | |||
| 5efdcf99dc | |||
|
|
3020a4244d | ||
| 848ad2c3cd | |||
| 57b07885e3 | |||
|
|
466ac13742 | ||
|
|
8e2069cecf | ||
| 92441e569e | |||
| 509c41a4d4 | |||
|
|
ec0fa3966a | ||
|
|
9b52621df1 | ||
| c323ef7a52 | |||
| 1bbd3a6f4d | |||
| c8987f6fdd | |||
|
|
a19c4e4eaf | ||
|
|
255a6dc616 | ||
|
|
0e075fe5d4 | ||
| 731dd21b0e | |||
| 39d73c0f2c | |||
|
|
b232cbf14d | ||
|
|
7930991eb8 | ||
|
|
9c83c9d9a5 | ||
| cd5bca19f6 | |||
| 9adbc1ea0c | |||
| f92d5c16e0 | |||
|
|
9bd63d90fc | ||
|
|
6b0fa81224 | ||
| dc2624ece1 | |||
| b58a14bc87 | |||
|
|
c68a4573dc | ||
|
|
7e487a487d | ||
|
|
6b9c05d5ee | ||
|
|
43f28a4225 | ||
| 60d10c03a6 | |||
| f9a60cec99 | |||
|
|
1bfd3a598a | ||
|
|
505f821df0 | ||
|
|
dc92939262 | ||
| e32739cb09 | |||
|
|
ab9ab90ffa | ||
|
|
38f980dbbf | ||
|
|
3d27e14620 | ||
| d67054d891 | |||
| b399587841 | |||
|
|
04081ab0ae | ||
|
|
1fa4c55869 | ||
| 4075ead84e | |||
| 031d7ba708 | |||
| e82d015cea | |||
| 82c801cf9c | |||
|
|
3f86f0be38 | ||
|
|
31d79a6c53 | ||
|
|
ba3d2c2b35 | ||
|
|
c4c9641901 | ||
|
|
b9385858f3 | ||
|
|
b9da0d6d76 | ||
| 0d4d7f4235 | |||
| 47198a0d01 | |||
|
|
e6d63ef4f7 | ||
|
|
e673dcbaeb | ||
|
|
74eae50ab0 | ||
|
|
5ec293fc94 | ||
|
|
d31bd14692 | ||
| 821af42976 | |||
|
|
579bf3796f | ||
|
|
f959f97099 | ||
|
|
800cf0c8d1 | ||
|
|
0223102269 | ||
|
|
abcc644f74 | ||
|
|
62444ef743 | ||
|
|
a253d1ccea | ||
|
|
aca10bcd45 | ||
| b7d8463198 | |||
|
|
4617328b8e | ||
|
|
070b0aea8d | ||
| 6835a35c02 | |||
| 02469383f4 | |||
| 15a3f843f1 | |||
| 8a5f2bc4df | |||
| ca176de4ef | |||
| d26bdb38ca | |||
| 2dff94c3bd | |||
|
|
bb9252e3a2 | ||
|
|
aacf433462 | ||
| e553bfcb22 | |||
| cb9998e0c4 | |||
| 15058727d0 | |||
| ab7af2ade8 | |||
|
|
9cf0d289c3 | ||
|
|
4988630db9 | ||
| cdf49ab8fe | |||
|
|
a43cedc00f | ||
|
|
667c411997 | ||
|
|
05fb0358a2 |
@@ -102,7 +102,6 @@ public class SysConfigController extends BaseController {
|
||||
/**
|
||||
* 根据参数键名修改参数配置
|
||||
*/
|
||||
@SaCheckPermission("system:config:edit")
|
||||
@Log(title = "参数管理", businessType = BusinessType.UPDATE)
|
||||
@PutMapping("/updateByKey")
|
||||
public R<Void> updateByKey(@RequestBody SysConfig config) {
|
||||
|
||||
@@ -260,8 +260,8 @@ springdoc:
|
||||
xss:
|
||||
# 过滤开关
|
||||
enabled: true
|
||||
# 排除链接(多个用逗号分隔)
|
||||
excludes: /system/notice
|
||||
# 排除链接(多个用逗号分隔)
|
||||
excludes: /system/notice,/system/dict/data
|
||||
# 匹配链接
|
||||
urlPatterns: /system/*,/monitor/*,/tool/*
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
-- 冷轧涂镀数智运营 - 规程主表
|
||||
CREATE TABLE wms_process_spec (
|
||||
spec_id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||||
spec_code VARCHAR(64) NOT NULL COMMENT '规程编号',
|
||||
spec_name VARCHAR(200) NOT NULL COMMENT '规程名称',
|
||||
spec_type VARCHAR(32) NOT NULL DEFAULT 'PROCESS' COMMENT '类型(PROCESS=工艺规程,STANDARD=标准)',
|
||||
line_id BIGINT NOT NULL COMMENT '产线ID',
|
||||
product_type VARCHAR(100) NULL COMMENT '产品类型',
|
||||
is_enabled TINYINT NOT NULL DEFAULT 1 COMMENT '是否启用(0否1是)',
|
||||
create_by VARCHAR(64) NULL COMMENT '创建人',
|
||||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
update_by VARCHAR(64) NULL COMMENT '更新人',
|
||||
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标志(0正常2删除,与全局逻辑删除配置一致)',
|
||||
remark VARCHAR(500) NULL COMMENT '备注',
|
||||
PRIMARY KEY (spec_id),
|
||||
UNIQUE KEY uk_wms_process_spec_code (spec_code),
|
||||
KEY idx_wms_process_spec_line (line_id),
|
||||
KEY idx_wms_process_spec_type (spec_type)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='规程主表';
|
||||
@@ -0,0 +1,39 @@
|
||||
-- 规程版本表
|
||||
CREATE TABLE wms_process_spec_version (
|
||||
version_id BIGINT NOT NULL COMMENT '主键',
|
||||
spec_id BIGINT NOT NULL COMMENT '规程主表ID',
|
||||
version_code VARCHAR(64) NOT NULL COMMENT '版本号',
|
||||
is_active TINYINT NOT NULL DEFAULT 0 COMMENT '是否当前生效(0否1是)',
|
||||
status VARCHAR(32) NOT NULL DEFAULT 'DRAFT' COMMENT '状态(DRAFT草稿/PUBLISHED已发布/OBSOLETE作废等)',
|
||||
create_by VARCHAR(64) NULL COMMENT '创建人',
|
||||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
update_by VARCHAR(64) NULL COMMENT '更新人',
|
||||
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标志(0正常2删除)',
|
||||
remark VARCHAR(500) NULL COMMENT '备注',
|
||||
PRIMARY KEY (version_id),
|
||||
UNIQUE KEY uk_spec_version_code (spec_id, version_code),
|
||||
KEY idx_spec_version_spec (spec_id),
|
||||
KEY idx_spec_version_active (spec_id, is_active)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='规程版本表';
|
||||
|
||||
-- 方案点位表
|
||||
CREATE TABLE wms_process_plan (
|
||||
plan_id BIGINT NOT NULL COMMENT '主键',
|
||||
version_id BIGINT NOT NULL COMMENT '规程版本ID',
|
||||
segment_type VARCHAR(32) NOT NULL COMMENT '段类型(INLET/PROCESS/OUTLET)',
|
||||
segment_name VARCHAR(100) NULL COMMENT '段名称',
|
||||
point_name VARCHAR(200) NOT NULL COMMENT '点位名称',
|
||||
point_code VARCHAR(64) NOT NULL COMMENT '点位编码',
|
||||
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序',
|
||||
create_by VARCHAR(64) NULL COMMENT '创建人',
|
||||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
update_by VARCHAR(64) NULL COMMENT '更新人',
|
||||
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标志(0正常2删除)',
|
||||
remark VARCHAR(500) NULL COMMENT '备注',
|
||||
PRIMARY KEY (plan_id),
|
||||
UNIQUE KEY uk_plan_version_point_code (version_id, point_code),
|
||||
KEY idx_plan_version (version_id),
|
||||
KEY idx_plan_sort (version_id, sort_order)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='方案点位表';
|
||||
@@ -0,0 +1,20 @@
|
||||
-- 方案参数表
|
||||
CREATE TABLE wms_process_plan_param (
|
||||
param_id BIGINT NOT NULL COMMENT '主键',
|
||||
plan_id BIGINT NOT NULL COMMENT '方案点位ID',
|
||||
param_code VARCHAR(64) NOT NULL COMMENT '参数编码',
|
||||
param_name VARCHAR(200) NOT NULL COMMENT '参数名称',
|
||||
target_value DECIMAL(24, 6) NULL COMMENT '设定值',
|
||||
lower_limit DECIMAL(24, 6) NULL COMMENT '下限',
|
||||
upper_limit DECIMAL(24, 6) NULL COMMENT '上限',
|
||||
unit VARCHAR(32) NULL COMMENT '单位',
|
||||
create_by VARCHAR(64) NULL COMMENT '创建人',
|
||||
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
update_by VARCHAR(64) NULL COMMENT '更新人',
|
||||
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||||
del_flag TINYINT NOT NULL DEFAULT 0 COMMENT '删除标志(0正常2删除)',
|
||||
remark VARCHAR(500) NULL COMMENT '备注',
|
||||
PRIMARY KEY (param_id),
|
||||
UNIQUE KEY uk_plan_param_code (plan_id, param_code),
|
||||
KEY idx_plan_param_plan (plan_id)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='方案参数表';
|
||||
@@ -7,6 +7,7 @@ import javax.validation.constraints.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
@@ -31,6 +32,11 @@ public class ApsPlanDetailBo extends BaseEntity {
|
||||
*/
|
||||
private Long planSheetId;
|
||||
|
||||
/**
|
||||
* 关联排产单ID列表(用于批量查询)
|
||||
*/
|
||||
private List<Long> planSheetIds;
|
||||
|
||||
/**
|
||||
* 内容序号
|
||||
*/
|
||||
|
||||
@@ -261,5 +261,11 @@ public class ApsPlanDetailVo {
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 技术附件
|
||||
*/
|
||||
@ExcelProperty(value = "技术附件")
|
||||
private String techAnnex;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
package com.klp.aps.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.klp.aps.domain.entity.ApsPlanDetail;
|
||||
import com.klp.aps.domain.vo.ApsPlanDetailVo;
|
||||
import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
@@ -15,4 +19,6 @@ import java.util.Collection;
|
||||
public interface ApsPlanDetailMapper extends BaseMapperPlus<ApsPlanDetailMapper, ApsPlanDetail, ApsPlanDetailVo> {
|
||||
|
||||
int deleteByPlanSheetIds(Collection<Long> planSheetIds);
|
||||
|
||||
Page<ApsPlanDetailVo> selectVoPagePlus(Page<ApsPlanDetailVo> page, @Param("ew") QueryWrapper<ApsPlanDetail> queryWrapper);
|
||||
}
|
||||
|
||||
@@ -18,5 +18,5 @@ import java.util.List;
|
||||
*/
|
||||
public interface ApsPlanSheetMapper extends BaseMapperPlus<ApsPlanSheetMapper, ApsPlanSheet, ApsPlanSheetVo> {
|
||||
|
||||
List<ApsPlanSheetRowVo> selectList(ApsPlanSheetQueryReq req);
|
||||
List<ApsPlanSheetRowVo> selectListByReq(ApsPlanSheetQueryReq req);
|
||||
}
|
||||
|
||||
@@ -31,6 +31,11 @@ public interface IApsPlanDetailService {
|
||||
*/
|
||||
List<ApsPlanDetailVo> queryList(ApsPlanDetailBo bo);
|
||||
|
||||
/**
|
||||
* 根据排产单ID列表查询明细
|
||||
*/
|
||||
List<ApsPlanDetailVo> queryListByPlanSheetIds(List<Long> planSheetIds);
|
||||
|
||||
/**
|
||||
* 新增排产单明细
|
||||
*/
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.klp.aps.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
@@ -44,11 +45,57 @@ public class ApsPlanDetailServiceImpl implements IApsPlanDetailService {
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<ApsPlanDetailVo> queryPageList(ApsPlanDetailBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<ApsPlanDetail> lqw = buildQueryWrapper(bo);
|
||||
Page<ApsPlanDetailVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
QueryWrapper<ApsPlanDetail> qw = buildQueryWrapperPlus(bo);
|
||||
Page<ApsPlanDetailVo> result = baseMapper.selectVoPagePlus(pageQuery.build(), qw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
private QueryWrapper<ApsPlanDetail> buildQueryWrapperPlus(ApsPlanDetailBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
QueryWrapper<ApsPlanDetail> qw = new QueryWrapper<>();
|
||||
qw.eq("d.del_flag", 0);
|
||||
qw.eq(bo.getPlanSheetId() != null, "d.plan_sheet_id", bo.getPlanSheetId());
|
||||
qw.eq(bo.getOrderId() != null, "d.order_id", bo.getOrderId());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getBizSeqNo()), "d.biz_seq_no", bo.getBizSeqNo());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getOrderCode()), "d.order_code", bo.getOrderCode());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getContractCode()), "d.contract_code", bo.getContractCode());
|
||||
qw.like(StringUtils.isNotBlank(bo.getCustomerName()), "d.customer_name", bo.getCustomerName());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getSalesman()), "d.salesman", bo.getSalesman());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getRawManufacturer()), "d.raw_manufacturer", bo.getRawManufacturer());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getRawMaterial()), "d.raw_material", bo.getRawMaterial());
|
||||
qw.eq(bo.getRawThick() != null, "d.raw_thick", bo.getRawThick());
|
||||
qw.eq(bo.getRawWidth() != null, "d.raw_width", bo.getRawWidth());
|
||||
qw.eq(bo.getRawMaterialId() != null, "d.raw_material_id", bo.getRawMaterialId());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getRawCoilNos()), "d.raw_coil_nos", bo.getRawCoilNos());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getRawLocation()), "d.raw_location", bo.getRawLocation());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getRawPackaging()), "d.raw_packaging", bo.getRawPackaging());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getRawEdgeReq()), "d.raw_edge_req", bo.getRawEdgeReq());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getRawCoatingType()), "d.raw_coating_type", bo.getRawCoatingType());
|
||||
qw.eq(bo.getRawNetWeight() != null, "d.raw_net_weight", bo.getRawNetWeight());
|
||||
qw.like(StringUtils.isNotBlank(bo.getProductName()), "d.product_name", bo.getProductName());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getProductMaterial()), "d.product_material", bo.getProductMaterial());
|
||||
qw.eq(bo.getCoatingG() != null, "d.coating_g", bo.getCoatingG());
|
||||
qw.eq(bo.getProductWidth() != null, "d.product_width", bo.getProductWidth());
|
||||
qw.eq(bo.getRollingThick() != null, "d.rolling_thick", bo.getRollingThick());
|
||||
qw.eq(bo.getMarkCoatThick() != null, "d.mark_coat_thick", bo.getMarkCoatThick());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getTonSteelLengthRange()), "d.ton_steel_length_range", bo.getTonSteelLengthRange());
|
||||
qw.eq(bo.getPlanQty() != null, "d.plan_qty", bo.getPlanQty());
|
||||
qw.eq(bo.getPlanWeight() != null, "d.plan_weight", bo.getPlanWeight());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getSurfaceTreatment()), "d.surface_treatment", bo.getSurfaceTreatment());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getWidthReq()), "d.width_req", bo.getWidthReq());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getProductPackaging()), "d.product_packaging", bo.getProductPackaging());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getProductEdgeReq()), "d.product_edge_req", bo.getProductEdgeReq());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getUsageReq()), "d.usage_req", bo.getUsageReq());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getPostProcess()), "d.post_process", bo.getPostProcess());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getNextProcess()), "d.next_process", bo.getNextProcess());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getSampleReq()), "d.sample_req", bo.getSampleReq());
|
||||
qw.eq(bo.getStartTime() != null, "d.start_time", bo.getStartTime());
|
||||
qw.eq(bo.getEndTime() != null, "d.end_time", bo.getEndTime());
|
||||
//根据创建时间倒叙
|
||||
qw.orderByDesc("d.create_time");
|
||||
return qw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询排产单明细列表
|
||||
*/
|
||||
@@ -58,6 +105,19 @@ public class ApsPlanDetailServiceImpl implements IApsPlanDetailService {
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据排产单ID列表查询明细
|
||||
*/
|
||||
@Override
|
||||
public List<ApsPlanDetailVo> queryListByPlanSheetIds(List<Long> planSheetIds) {
|
||||
if (planSheetIds == null || planSheetIds.isEmpty()) {
|
||||
return new java.util.ArrayList<>();
|
||||
}
|
||||
LambdaQueryWrapper<ApsPlanDetail> lqw = Wrappers.lambdaQuery();
|
||||
lqw.in(ApsPlanDetail::getPlanSheetId, planSheetIds);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<ApsPlanDetail> buildQueryWrapper(ApsPlanDetailBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<ApsPlanDetail> lqw = Wrappers.lambdaQuery();
|
||||
|
||||
@@ -318,7 +318,7 @@ public class ApsPlanSheetServiceImpl implements IApsPlanSheetService {
|
||||
}
|
||||
|
||||
private List<ApsPlanSheetRowVo> queryListAll(ApsPlanSheetQueryReq req) {
|
||||
return baseMapper.selectList(req);
|
||||
return baseMapper.selectListByReq(req);
|
||||
}
|
||||
|
||||
private String nvl(Object v, Object fallback) {
|
||||
|
||||
@@ -58,4 +58,14 @@
|
||||
</foreach>
|
||||
</delete>
|
||||
|
||||
<select id="selectVoPagePlus" resultType="com.klp.aps.domain.vo.ApsPlanDetailVo">
|
||||
SELECT
|
||||
d.*,
|
||||
c.tech_annex AS techAnnex
|
||||
FROM aps_plan_detail d
|
||||
LEFT JOIN crm_order o ON d.order_id = o.order_id AND o.del_flag = 0
|
||||
LEFT JOIN crm_contract c ON o.contract_id = c.contract_id AND c.del_flag = 0
|
||||
${ew.customSqlSegment}
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
</resultMap>
|
||||
<select id="selectList" parameterType="com.klp.aps.domain.dto.ApsPlanSheetQueryReq" resultType="com.klp.aps.domain.vo.ApsPlanSheetRowVo">
|
||||
<select id="selectListByReq" parameterType="com.klp.aps.domain.dto.ApsPlanSheetQueryReq" resultType="com.klp.aps.domain.vo.ApsPlanSheetRowVo">
|
||||
SELECT
|
||||
d.plan_detail_id AS detailSheetId,
|
||||
s.plan_date AS planDate,
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<maven.compiler.target>8</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
<dependencies>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
@@ -43,5 +43,9 @@
|
||||
<groupId>com.klp</groupId>
|
||||
<artifactId>klp-wms</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.klp</groupId>
|
||||
<artifactId>klp-aps</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
package com.klp.crm.controller;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.*;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import com.klp.common.annotation.RepeatSubmit;
|
||||
import com.klp.common.annotation.Log;
|
||||
import com.klp.common.core.controller.BaseController;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.domain.R;
|
||||
import com.klp.common.core.validate.AddGroup;
|
||||
import com.klp.common.core.validate.EditGroup;
|
||||
import com.klp.common.enums.BusinessType;
|
||||
import com.klp.common.utils.poi.ExcelUtil;
|
||||
import com.klp.crm.domain.vo.CrmContractVo;
|
||||
import com.klp.crm.domain.bo.CrmContractBo;
|
||||
import com.klp.crm.service.ICrmContractService;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 合同信息
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/crm/contract")
|
||||
public class CrmContractController extends BaseController {
|
||||
|
||||
private final ICrmContractService iCrmContractService;
|
||||
|
||||
/**
|
||||
* 查询合同信息列表
|
||||
*/
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<CrmContractVo> list(CrmContractBo bo, PageQuery pageQuery) {
|
||||
return iCrmContractService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出合同信息列表
|
||||
*/
|
||||
@Log(title = "合同信息", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(CrmContractBo bo, HttpServletResponse response) {
|
||||
List<CrmContractVo> list = iCrmContractService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "合同信息", CrmContractVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取合同信息详细信息
|
||||
*
|
||||
* @param contractId 主键
|
||||
*/
|
||||
@GetMapping("/{contractId}")
|
||||
public R<CrmContractVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long contractId) {
|
||||
return R.ok(iCrmContractService.queryById(contractId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增合同信息
|
||||
*/
|
||||
@Log(title = "合同信息", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody CrmContractBo bo) {
|
||||
return toAjax(iCrmContractService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改合同信息
|
||||
*/
|
||||
@Log(title = "合同信息", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CrmContractBo bo) {
|
||||
return toAjax(iCrmContractService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除合同信息
|
||||
*
|
||||
* @param contractIds 主键串
|
||||
*/
|
||||
@Log(title = "合同信息", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{contractIds}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] contractIds) {
|
||||
return toAjax(iCrmContractService.deleteWithValidByIds(Arrays.asList(contractIds), true));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
package com.klp.crm.controller;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.*;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import com.klp.common.annotation.RepeatSubmit;
|
||||
import com.klp.common.annotation.Log;
|
||||
import com.klp.common.core.controller.BaseController;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.domain.R;
|
||||
import com.klp.common.core.validate.AddGroup;
|
||||
import com.klp.common.core.validate.EditGroup;
|
||||
import com.klp.common.enums.BusinessType;
|
||||
import com.klp.common.utils.poi.ExcelUtil;
|
||||
import com.klp.crm.domain.vo.CrmContractProductVo;
|
||||
import com.klp.crm.domain.bo.CrmContractProductBo;
|
||||
import com.klp.crm.service.ICrmContractProductService;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 合同产品明细
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/crm/contractProduct")
|
||||
public class CrmContractProductController extends BaseController {
|
||||
|
||||
private final ICrmContractProductService iCrmContractProductService;
|
||||
|
||||
/**
|
||||
* 查询合同产品明细列表
|
||||
*/
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<CrmContractProductVo> list(CrmContractProductBo bo, PageQuery pageQuery) {
|
||||
return iCrmContractProductService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出合同产品明细列表
|
||||
*/
|
||||
@Log(title = "合同产品明细", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(CrmContractProductBo bo, HttpServletResponse response) {
|
||||
List<CrmContractProductVo> list = iCrmContractProductService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "合同产品明细", CrmContractProductVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取合同产品明细详细信息
|
||||
*
|
||||
* @param contractProductId 主键
|
||||
*/
|
||||
@GetMapping("/{contractProductId}")
|
||||
public R<CrmContractProductVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long contractProductId) {
|
||||
return R.ok(iCrmContractProductService.queryById(contractProductId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增合同产品明细
|
||||
*/
|
||||
@Log(title = "合同产品明细", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Void> add(@Validated(AddGroup.class) @RequestBody CrmContractProductBo bo) {
|
||||
return toAjax(iCrmContractProductService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改合同产品明细
|
||||
*/
|
||||
@Log(title = "合同产品明细", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CrmContractProductBo bo) {
|
||||
return toAjax(iCrmContractProductService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除合同产品明细
|
||||
*
|
||||
* @param contractProductIds 主键串
|
||||
*/
|
||||
@Log(title = "合同产品明细", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{contractProductIds}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] contractProductIds) {
|
||||
return toAjax(iCrmContractProductService.deleteWithValidByIds(Arrays.asList(contractProductIds), true));
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,17 @@
|
||||
package com.klp.crm.controller;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
import java.util.Date;
|
||||
|
||||
import com.klp.aps.domain.bo.ApsPlanDetailBo;
|
||||
import com.klp.aps.domain.bo.ApsPlanSheetBo;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.*;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import com.klp.common.annotation.RepeatSubmit;
|
||||
import com.klp.common.annotation.Log;
|
||||
@@ -21,6 +26,10 @@ import com.klp.crm.domain.vo.CrmOrderVo;
|
||||
import com.klp.crm.domain.bo.CrmOrderBo;
|
||||
import com.klp.crm.service.ICrmOrderService;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.aps.domain.vo.ApsPlanSheetVo;
|
||||
import com.klp.aps.domain.vo.ApsPlanDetailVo;
|
||||
import com.klp.aps.service.IApsPlanSheetService;
|
||||
import com.klp.aps.service.IApsPlanDetailService;
|
||||
|
||||
/**
|
||||
* 正式订单主
|
||||
@@ -35,6 +44,8 @@ import com.klp.common.core.page.TableDataInfo;
|
||||
public class CrmOrderController extends BaseController {
|
||||
|
||||
private final ICrmOrderService iCrmOrderService;
|
||||
private final IApsPlanSheetService iApsPlanSheetService;
|
||||
private final IApsPlanDetailService iApsPlanDetailService;
|
||||
|
||||
/**
|
||||
* 查询正式订单主列表
|
||||
@@ -96,4 +107,54 @@ public class CrmOrderController extends BaseController {
|
||||
@PathVariable String[] orderIds) {
|
||||
return toAjax(iCrmOrderService.deleteWithValidByIds(Arrays.asList(orderIds), true));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询每日订单(根据排产计划获取今天的订单)
|
||||
*
|
||||
* @param planDate 排产日期,默认今天
|
||||
*/
|
||||
@GetMapping("/daily")
|
||||
public R<List<CrmOrderVo>> getDailyOrders(
|
||||
@RequestParam(value = "planDate", required = false)
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd") Date planDate) {
|
||||
if (planDate == null) {
|
||||
planDate = new Date();
|
||||
}
|
||||
// 将日期设置为当天的开始时间 00:00:00
|
||||
java.util.Calendar calendar = java.util.Calendar.getInstance();
|
||||
calendar.setTime(planDate);
|
||||
calendar.set(java.util.Calendar.HOUR_OF_DAY, 0);
|
||||
calendar.set(java.util.Calendar.MINUTE, 0);
|
||||
calendar.set(java.util.Calendar.SECOND, 0);
|
||||
calendar.set(java.util.Calendar.MILLISECOND, 0);
|
||||
planDate = calendar.getTime();
|
||||
|
||||
ApsPlanSheetBo bo = new ApsPlanSheetBo();
|
||||
bo.setPlanDate(planDate);
|
||||
List<ApsPlanSheetVo> planSheetList = iApsPlanSheetService.queryList(bo);
|
||||
if (planSheetList == null || planSheetList.isEmpty()) {
|
||||
return R.ok(new ArrayList<>());
|
||||
}
|
||||
List<Long> planSheetIds = new ArrayList<>();
|
||||
for (ApsPlanSheetVo sheet : planSheetList) {
|
||||
planSheetIds.add(sheet.getPlanSheetId());
|
||||
}
|
||||
ApsPlanDetailBo detailBo = new ApsPlanDetailBo();
|
||||
detailBo.setPlanSheetIds(planSheetIds);
|
||||
List<ApsPlanDetailVo> detailList = iApsPlanDetailService.queryListByPlanSheetIds(planSheetIds);
|
||||
if (detailList == null || detailList.isEmpty()) {
|
||||
return R.ok(new ArrayList<>());
|
||||
}
|
||||
List<Long> orderIds = new ArrayList<>();
|
||||
for (ApsPlanDetailVo detail : detailList) {
|
||||
if (detail.getOrderId() != null) {
|
||||
orderIds.add(detail.getOrderId());
|
||||
}
|
||||
}
|
||||
if (orderIds.isEmpty()) {
|
||||
return R.ok(new ArrayList<>());
|
||||
}
|
||||
List<CrmOrderVo> orders = iCrmOrderService.queryByIds(orderIds);
|
||||
return R.ok(orders);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,8 +18,10 @@ import com.klp.common.core.validate.EditGroup;
|
||||
import com.klp.common.enums.BusinessType;
|
||||
import com.klp.common.utils.poi.ExcelUtil;
|
||||
import com.klp.crm.domain.vo.CrmOrderItemVo;
|
||||
import com.klp.crm.domain.vo.CrmContractOrderFinanceVo;
|
||||
import com.klp.crm.domain.bo.CrmOrderItemBo;
|
||||
import com.klp.crm.service.ICrmOrderItemService;
|
||||
import com.klp.domain.vo.WmsMaterialCoilVo;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
@@ -96,4 +98,38 @@ public class CrmOrderItemController extends BaseController {
|
||||
@PathVariable String[] itemIds) {
|
||||
return toAjax(iCrmOrderItemService.deleteWithValidByIds(Arrays.asList(itemIds), true));
|
||||
}
|
||||
|
||||
// 根据合同id查询该合同下属订单关联的异议和财务信息。。
|
||||
@GetMapping("/contractFinance/{contractId}")
|
||||
public R<CrmContractOrderFinanceVo> getContractFinance(@NotNull(message = "合同ID不能为空")
|
||||
@PathVariable Long contractId) {
|
||||
return R.ok(iCrmOrderItemService.queryFinanceAndObjectionByContractId(contractId));
|
||||
}
|
||||
// 根据订单id查询发货单据中的配卷。
|
||||
@GetMapping("/coils/order/{orderId}")
|
||||
public R<List<WmsMaterialCoilVo>> getCoilsByOrderId(@NotNull(message = "订单ID不能为空")
|
||||
@PathVariable Long orderId) {
|
||||
return R.ok(iCrmOrderItemService.queryCoilsByOrderId(orderId));
|
||||
}
|
||||
|
||||
// 根据合同id查询发货单据中的配卷。
|
||||
@GetMapping("/coils/contract/{contractId}")
|
||||
public R<List<WmsMaterialCoilVo>> getCoilsByContractId(@NotNull(message = "合同ID不能为空")
|
||||
@PathVariable Long contractId) {
|
||||
return R.ok(iCrmOrderItemService.queryCoilsByContractId(contractId));
|
||||
}
|
||||
|
||||
// 根据客户id查询该客户下属订单关联的异议和财务信息。
|
||||
@GetMapping("/customerFinance/{customerId}")
|
||||
public R<CrmContractOrderFinanceVo> getCustomerFinance(@NotNull(message = "客户ID不能为空")
|
||||
@PathVariable String customerId) {
|
||||
return R.ok(iCrmOrderItemService.queryFinanceAndObjectionByCustomerId(customerId));
|
||||
}
|
||||
|
||||
// 根据客户id查询发货单据中的配卷。
|
||||
@GetMapping("/coils/customer/{customerId}")
|
||||
public R<List<WmsMaterialCoilVo>> getCoilsByCustomerId(@NotNull(message = "客户ID不能为空")
|
||||
@PathVariable String customerId) {
|
||||
return R.ok(iCrmOrderItemService.queryCoilsByCustomerId(customerId));
|
||||
}
|
||||
}
|
||||
|
||||
135
klp-crm/src/main/java/com/klp/crm/domain/CrmContract.java
Normal file
135
klp-crm/src/main/java/com/klp/crm/domain/CrmContract.java
Normal file
@@ -0,0 +1,135 @@
|
||||
package com.klp.crm.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
/**
|
||||
* 合同信息对象 crm_contract
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("crm_contract")
|
||||
public class CrmContract extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID=1L;
|
||||
|
||||
/**
|
||||
* 合同主键ID
|
||||
*/
|
||||
@TableId(value = "contract_id")
|
||||
private Long contractId;
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
/**
|
||||
* 合同编号
|
||||
*/
|
||||
private String contractNo;
|
||||
/**
|
||||
* 供方
|
||||
*/
|
||||
private String supplier;
|
||||
/**
|
||||
* 需方
|
||||
*/
|
||||
private String customer;
|
||||
/**
|
||||
* 客户ID
|
||||
*/
|
||||
private Long customerId;
|
||||
/**
|
||||
* 签订时间
|
||||
*/
|
||||
private Date signTime;
|
||||
/**
|
||||
* 交货日期
|
||||
*/
|
||||
private Date deliveryDate;
|
||||
/**
|
||||
* 签订地点
|
||||
*/
|
||||
private String signLocation;
|
||||
/**
|
||||
* 产品内容
|
||||
*/
|
||||
private String productContent;
|
||||
/**
|
||||
* 合同内容
|
||||
*/
|
||||
private String contractContent;
|
||||
/**
|
||||
* 供方地址
|
||||
*/
|
||||
private String supplierAddress;
|
||||
/**
|
||||
* 供方电话
|
||||
*/
|
||||
private String supplierPhone;
|
||||
/**
|
||||
* 供方开户行
|
||||
*/
|
||||
private String supplierBank;
|
||||
/**
|
||||
* 供方账号
|
||||
*/
|
||||
private String supplierAccount;
|
||||
/**
|
||||
* 供方税号
|
||||
*/
|
||||
private String supplierTaxNo;
|
||||
/**
|
||||
* 需方地址
|
||||
*/
|
||||
private String customerAddress;
|
||||
/**
|
||||
* 需方电话
|
||||
*/
|
||||
private String customerPhone;
|
||||
/**
|
||||
* 需方开户行
|
||||
*/
|
||||
private String customerBank;
|
||||
/**
|
||||
* 需方账号
|
||||
*/
|
||||
private String customerAccount;
|
||||
/**
|
||||
* 需方税号
|
||||
*/
|
||||
private String customerTaxNo;
|
||||
/**
|
||||
* 技术附件
|
||||
*/
|
||||
private String techAnnex;
|
||||
/**
|
||||
* 商务附件
|
||||
*/
|
||||
private String businessAnnex;
|
||||
/**
|
||||
* 排产函
|
||||
*/
|
||||
private String productionSchedule;
|
||||
/**
|
||||
* 合同状态 0=草稿 1=生效 2=作废 3=已完成
|
||||
*/
|
||||
private Long status;
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
/**
|
||||
* 删除标识 0正常 2删除
|
||||
*/
|
||||
@TableLogic
|
||||
private Long delFlag;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package com.klp.crm.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 合同产品明细对象 crm_contract_product
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("crm_contract_product")
|
||||
public class CrmContractProduct extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID=1L;
|
||||
|
||||
/**
|
||||
* 合同产品主键ID
|
||||
*/
|
||||
@TableId(value = "contract_product_id")
|
||||
private Long contractProductId;
|
||||
/**
|
||||
* 关联合同ID(绑定wms_contract表主键)
|
||||
*/
|
||||
private Long contractId;
|
||||
/**
|
||||
* 产品名称
|
||||
*/
|
||||
private String productName;
|
||||
/**
|
||||
* 规格最小值(mm)
|
||||
*/
|
||||
private BigDecimal specMin;
|
||||
/**
|
||||
* 规格最大值(mm)
|
||||
*/
|
||||
private BigDecimal specMax;
|
||||
/**
|
||||
* 材质
|
||||
*/
|
||||
private String material;
|
||||
/**
|
||||
* 数量(吨)
|
||||
*/
|
||||
private BigDecimal quantity;
|
||||
/**
|
||||
* 含税单价(元/吨)
|
||||
*/
|
||||
private BigDecimal taxInclusiveUnitPrice;
|
||||
/**
|
||||
* 不含税单价(元/吨)
|
||||
*/
|
||||
private BigDecimal exTaxUnitPrice;
|
||||
/**
|
||||
* 含税总额(元)
|
||||
*/
|
||||
private BigDecimal taxInclusiveAmount;
|
||||
/**
|
||||
* 删除标识 0正常 2删除
|
||||
*/
|
||||
@TableLogic
|
||||
private Long delFlag;
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
}
|
||||
@@ -56,6 +56,10 @@ public class CrmCustomer extends BaseEntity {
|
||||
* 银行信息(多条,需权限查看,JSON格式存储)
|
||||
*/
|
||||
private String bankInfo;
|
||||
/**
|
||||
* 纳税人识别号/税号
|
||||
*/
|
||||
private String taxNumber;
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
|
||||
@@ -26,7 +26,7 @@ public class CrmOrder extends BaseEntity {
|
||||
* 订单ID(主键)
|
||||
*/
|
||||
@TableId(value = "order_id")
|
||||
private String orderId;
|
||||
private Long orderId;
|
||||
/**
|
||||
* 订单编号
|
||||
*/
|
||||
@@ -85,6 +85,141 @@ public class CrmOrder extends BaseEntity {
|
||||
*/
|
||||
private String contractCode;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 供方
|
||||
*/
|
||||
private String supplier;
|
||||
|
||||
/**
|
||||
* 需方
|
||||
*/
|
||||
private String customer;
|
||||
|
||||
/**
|
||||
* 签订时间
|
||||
*/
|
||||
private Date signTime;
|
||||
|
||||
/**
|
||||
* 签订地点
|
||||
*/
|
||||
private String signLocation;
|
||||
|
||||
/**
|
||||
* 产品内容
|
||||
*/
|
||||
private String productContent;
|
||||
|
||||
/**
|
||||
* 合同内容
|
||||
*/
|
||||
private String contractContent;
|
||||
|
||||
/**
|
||||
* 供方地址
|
||||
*/
|
||||
private String supplierAddress;
|
||||
|
||||
/**
|
||||
* 供方电话
|
||||
*/
|
||||
private String supplierPhone;
|
||||
|
||||
/**
|
||||
* 供方开户行
|
||||
*/
|
||||
private String supplierBank;
|
||||
|
||||
/**
|
||||
* 供方账号
|
||||
*/
|
||||
private String supplierAccount;
|
||||
|
||||
/**
|
||||
* 供方税号
|
||||
*/
|
||||
private String supplierTaxNo;
|
||||
|
||||
/**
|
||||
* 需方地址
|
||||
*/
|
||||
private String customerAddress;
|
||||
|
||||
/**
|
||||
* 需方电话
|
||||
*/
|
||||
private String customerPhone;
|
||||
|
||||
/**
|
||||
* 需方开户行
|
||||
*/
|
||||
private String customerBank;
|
||||
|
||||
/**
|
||||
* 需方账号
|
||||
*/
|
||||
private String customerAccount;
|
||||
|
||||
/**
|
||||
* 需方税号
|
||||
*/
|
||||
private String customerTaxNo;
|
||||
|
||||
/**
|
||||
* 技术附件
|
||||
*/
|
||||
private String techAnnex;
|
||||
|
||||
/**
|
||||
* 商务附件
|
||||
*/
|
||||
private String businessAnnex;
|
||||
|
||||
/**
|
||||
* 排产函
|
||||
*/
|
||||
private String productionSchedule;
|
||||
|
||||
/**
|
||||
* 算单价备注
|
||||
*/
|
||||
private String unitPriceRemark;
|
||||
|
||||
/**
|
||||
* 应付定金(万元)
|
||||
*/
|
||||
private BigDecimal depositPayable;
|
||||
|
||||
/**
|
||||
* 已付定金(万元)
|
||||
*/
|
||||
private BigDecimal depositPaid;
|
||||
|
||||
/**
|
||||
* 定金比例(%)
|
||||
*/
|
||||
private BigDecimal depositRatio;
|
||||
|
||||
/**
|
||||
* 合同状态 0=草稿 1=生效 2=作废 3=已完成
|
||||
*/
|
||||
private Long status;
|
||||
|
||||
/**
|
||||
* 关联合同ID(wms_contract.contract_id)
|
||||
*/
|
||||
private Long contractId;
|
||||
|
||||
/**
|
||||
* 附件(多个文件URL用逗号分隔)
|
||||
*/
|
||||
private String annexFiles;
|
||||
|
||||
/**
|
||||
* 删除标识 0正常 2删除
|
||||
*/
|
||||
|
||||
@@ -24,11 +24,11 @@ public class CrmOrderItem extends BaseEntity {
|
||||
* 正式订单明细ID(主键)
|
||||
*/
|
||||
@TableId(value = "item_id")
|
||||
private String itemId;
|
||||
private Long itemId;
|
||||
/**
|
||||
* 关联正式订单ID(外键)
|
||||
*/
|
||||
private String orderId;
|
||||
private Long orderId;
|
||||
/**
|
||||
* 产品类型
|
||||
*/
|
||||
@@ -69,6 +69,14 @@ public class CrmOrderItem extends BaseEntity {
|
||||
* 重量
|
||||
*/
|
||||
private BigDecimal weight;
|
||||
/**
|
||||
* 宽度公差
|
||||
*/
|
||||
private BigDecimal widthTolerance;
|
||||
/**
|
||||
* 厚度公差
|
||||
*/
|
||||
private BigDecimal thicknessTolerance;
|
||||
/**
|
||||
* 合同定价
|
||||
*/
|
||||
@@ -85,10 +93,34 @@ public class CrmOrderItem extends BaseEntity {
|
||||
* 排产批次
|
||||
*/
|
||||
private String productionBatch;
|
||||
/**
|
||||
* 表面处理
|
||||
*/
|
||||
private String surfaceTreatment;
|
||||
/**
|
||||
* 切边要求
|
||||
*/
|
||||
private String edgeCuttingReq;
|
||||
/**
|
||||
* 包装要求
|
||||
*/
|
||||
private String packagingReq;
|
||||
/**
|
||||
* 宽度
|
||||
*/
|
||||
private BigDecimal width;
|
||||
/**
|
||||
* 厚度
|
||||
*/
|
||||
private BigDecimal thickness;
|
||||
/**
|
||||
* 用途
|
||||
*/
|
||||
private String purpose;
|
||||
/**
|
||||
* 删除标识 0正常 2删除
|
||||
*/
|
||||
@TableLogic
|
||||
private Long delFlag;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
161
klp-crm/src/main/java/com/klp/crm/domain/bo/CrmContractBo.java
Normal file
161
klp-crm/src/main/java/com/klp/crm/domain/bo/CrmContractBo.java
Normal file
@@ -0,0 +1,161 @@
|
||||
package com.klp.crm.domain.bo;
|
||||
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
/**
|
||||
* 合同信息业务对象 crm_contract
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class CrmContractBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 合同主键ID
|
||||
*/
|
||||
private Long contractId;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 合同编号
|
||||
*/
|
||||
private String contractNo;
|
||||
|
||||
/**
|
||||
* 供方
|
||||
*/
|
||||
private String supplier;
|
||||
|
||||
/**
|
||||
* 需方
|
||||
*/
|
||||
private String customer;
|
||||
|
||||
/**
|
||||
* 客户ID
|
||||
*/
|
||||
private Long customerId;
|
||||
|
||||
/**
|
||||
* 签订时间
|
||||
*/
|
||||
private Date signTime;
|
||||
|
||||
/**
|
||||
* 交货日期
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private Date deliveryDate;
|
||||
|
||||
/**
|
||||
* 签订地点
|
||||
*/
|
||||
private String signLocation;
|
||||
|
||||
/**
|
||||
* 产品内容
|
||||
*/
|
||||
private String productContent;
|
||||
|
||||
/**
|
||||
* 合同内容
|
||||
*/
|
||||
private String contractContent;
|
||||
|
||||
/**
|
||||
* 供方地址
|
||||
*/
|
||||
private String supplierAddress;
|
||||
|
||||
/**
|
||||
* 供方电话
|
||||
*/
|
||||
private String supplierPhone;
|
||||
|
||||
/**
|
||||
* 供方开户行
|
||||
*/
|
||||
private String supplierBank;
|
||||
|
||||
/**
|
||||
* 供方账号
|
||||
*/
|
||||
private String supplierAccount;
|
||||
|
||||
/**
|
||||
* 供方税号
|
||||
*/
|
||||
private String supplierTaxNo;
|
||||
|
||||
/**
|
||||
* 需方地址
|
||||
*/
|
||||
private String customerAddress;
|
||||
|
||||
/**
|
||||
* 需方电话
|
||||
*/
|
||||
private String customerPhone;
|
||||
|
||||
/**
|
||||
* 需方开户行
|
||||
*/
|
||||
private String customerBank;
|
||||
|
||||
/**
|
||||
* 需方账号
|
||||
*/
|
||||
private String customerAccount;
|
||||
|
||||
/**
|
||||
* 需方税号
|
||||
*/
|
||||
private String customerTaxNo;
|
||||
|
||||
/**
|
||||
* 技术附件
|
||||
*/
|
||||
private String techAnnex;
|
||||
|
||||
/**
|
||||
* 商务附件
|
||||
*/
|
||||
private String businessAnnex;
|
||||
|
||||
/**
|
||||
* 排产函
|
||||
*/
|
||||
private String productionSchedule;
|
||||
|
||||
/**
|
||||
* 合同状态 0=草稿 1=生效 2=作废 3=已完成
|
||||
*/
|
||||
private Long status;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 关键字搜索
|
||||
*/
|
||||
private String keyword;
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,77 @@
|
||||
package com.klp.crm.domain.bo;
|
||||
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* 合同产品明细业务对象 crm_contract_product
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class CrmContractProductBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 合同产品主键ID
|
||||
*/
|
||||
private Long contractProductId;
|
||||
|
||||
/**
|
||||
* 关联合同ID(绑定wms_contract表主键)
|
||||
*/
|
||||
private Long contractId;
|
||||
|
||||
/**
|
||||
* 产品名称
|
||||
*/
|
||||
private String productName;
|
||||
|
||||
/**
|
||||
* 规格最小值(mm)
|
||||
*/
|
||||
private BigDecimal specMin;
|
||||
|
||||
/**
|
||||
* 规格最大值(mm)
|
||||
*/
|
||||
private BigDecimal specMax;
|
||||
|
||||
/**
|
||||
* 材质
|
||||
*/
|
||||
private String material;
|
||||
|
||||
/**
|
||||
* 数量(吨)
|
||||
*/
|
||||
private BigDecimal quantity;
|
||||
|
||||
/**
|
||||
* 含税单价(元/吨)
|
||||
*/
|
||||
private BigDecimal taxInclusiveUnitPrice;
|
||||
|
||||
/**
|
||||
* 不含税单价(元/吨)
|
||||
*/
|
||||
private BigDecimal exTaxUnitPrice;
|
||||
|
||||
/**
|
||||
* 含税总额(元)
|
||||
*/
|
||||
private BigDecimal taxInclusiveAmount;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@@ -62,10 +62,20 @@ public class CrmCustomerBo extends BaseEntity {
|
||||
*/
|
||||
private String bankInfo;
|
||||
|
||||
/**
|
||||
* 纳税人识别号/税号
|
||||
*/
|
||||
private String taxNumber;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 关键字搜索
|
||||
*/
|
||||
private String keyword;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import javax.validation.constraints.*;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
/**
|
||||
* 正式订单主业务对象 crm_order
|
||||
@@ -23,7 +24,7 @@ public class CrmOrderBo extends BaseEntity {
|
||||
/**
|
||||
* 订单ID(主键)
|
||||
*/
|
||||
private String orderId;
|
||||
private Long orderId;
|
||||
|
||||
/**
|
||||
* 订单编号
|
||||
@@ -53,6 +54,8 @@ public class CrmOrderBo extends BaseEntity {
|
||||
/**
|
||||
* 交货日期
|
||||
*/
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
private Date deliveryDate;
|
||||
|
||||
/**
|
||||
@@ -95,5 +98,147 @@ public class CrmOrderBo extends BaseEntity {
|
||||
*/
|
||||
private String contractCode;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 供方
|
||||
*/
|
||||
private String supplier;
|
||||
|
||||
/**
|
||||
* 需方
|
||||
*/
|
||||
private String customer;
|
||||
|
||||
/**
|
||||
* 签订时间
|
||||
*/
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private Date signTime;
|
||||
|
||||
/**
|
||||
* 签订地点
|
||||
*/
|
||||
private String signLocation;
|
||||
|
||||
/**
|
||||
* 产品内容
|
||||
*/
|
||||
private String productContent;
|
||||
|
||||
/**
|
||||
* 合同内容
|
||||
*/
|
||||
private String contractContent;
|
||||
|
||||
/**
|
||||
* 供方地址
|
||||
*/
|
||||
private String supplierAddress;
|
||||
|
||||
/**
|
||||
* 供方电话
|
||||
*/
|
||||
private String supplierPhone;
|
||||
|
||||
/**
|
||||
* 供方开户行
|
||||
*/
|
||||
private String supplierBank;
|
||||
|
||||
/**
|
||||
* 供方账号
|
||||
*/
|
||||
private String supplierAccount;
|
||||
|
||||
/**
|
||||
* 供方税号
|
||||
*/
|
||||
private String supplierTaxNo;
|
||||
|
||||
/**
|
||||
* 需方地址
|
||||
*/
|
||||
private String customerAddress;
|
||||
|
||||
/**
|
||||
* 需方电话
|
||||
*/
|
||||
private String customerPhone;
|
||||
|
||||
/**
|
||||
* 需方开户行
|
||||
*/
|
||||
private String customerBank;
|
||||
|
||||
/**
|
||||
* 需方账号
|
||||
*/
|
||||
private String customerAccount;
|
||||
|
||||
/**
|
||||
* 需方税号
|
||||
*/
|
||||
private String customerTaxNo;
|
||||
|
||||
/**
|
||||
* 技术附件
|
||||
*/
|
||||
private String techAnnex;
|
||||
|
||||
/**
|
||||
* 商务附件
|
||||
*/
|
||||
private String businessAnnex;
|
||||
|
||||
/**
|
||||
* 排产函
|
||||
*/
|
||||
private String productionSchedule;
|
||||
|
||||
/**
|
||||
* 算单价备注
|
||||
*/
|
||||
private String unitPriceRemark;
|
||||
|
||||
/**
|
||||
* 应付定金(万元)
|
||||
*/
|
||||
private BigDecimal depositPayable;
|
||||
|
||||
/**
|
||||
* 已付定金(万元)
|
||||
*/
|
||||
private BigDecimal depositPaid;
|
||||
|
||||
/**
|
||||
* 定金比例(%)
|
||||
*/
|
||||
private BigDecimal depositRatio;
|
||||
|
||||
/**
|
||||
* 合同状态 0=草稿 1=生效 2=作废 3=已完成
|
||||
*/
|
||||
private Long status;
|
||||
|
||||
/**
|
||||
* 关联合同ID(wms_contract.contract_id)
|
||||
*/
|
||||
private Long contractId;
|
||||
|
||||
/**
|
||||
* 附件(多个文件URL用逗号分隔)
|
||||
*/
|
||||
private String annexFiles;
|
||||
|
||||
/**
|
||||
* 关键字搜索
|
||||
*/
|
||||
private String keyword;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -21,12 +21,12 @@ public class CrmOrderItemBo extends BaseEntity {
|
||||
/**
|
||||
* 正式订单明细ID(主键)
|
||||
*/
|
||||
private String itemId;
|
||||
private Long itemId;
|
||||
|
||||
/**
|
||||
* 关联正式订单ID(外键)
|
||||
*/
|
||||
private String orderId;
|
||||
private Long orderId;
|
||||
|
||||
/**
|
||||
* 产品类型
|
||||
@@ -57,7 +57,7 @@ public class CrmOrderItemBo extends BaseEntity {
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
|
||||
/**
|
||||
* 成品规格
|
||||
*/
|
||||
@@ -78,6 +78,16 @@ public class CrmOrderItemBo extends BaseEntity {
|
||||
*/
|
||||
private BigDecimal weight;
|
||||
|
||||
/**
|
||||
* 宽度公差
|
||||
*/
|
||||
private BigDecimal widthTolerance;
|
||||
|
||||
/**
|
||||
* 厚度公差
|
||||
*/
|
||||
private BigDecimal thicknessTolerance;
|
||||
|
||||
/**
|
||||
* 合同定价
|
||||
*/
|
||||
@@ -98,5 +108,34 @@ public class CrmOrderItemBo extends BaseEntity {
|
||||
*/
|
||||
private String productionBatch;
|
||||
|
||||
/**
|
||||
* 表面处理
|
||||
*/
|
||||
private String surfaceTreatment;
|
||||
|
||||
}
|
||||
/**
|
||||
* 切边要求
|
||||
*/
|
||||
private String edgeCuttingReq;
|
||||
|
||||
/**
|
||||
* 包装要求
|
||||
*/
|
||||
private String packagingReq;
|
||||
|
||||
/**
|
||||
* 宽度
|
||||
*/
|
||||
private BigDecimal width;
|
||||
|
||||
/**
|
||||
* 厚度
|
||||
*/
|
||||
private BigDecimal thickness;
|
||||
|
||||
/**
|
||||
* 用途
|
||||
*/
|
||||
private String purpose;
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.klp.crm.domain.vo;
|
||||
|
||||
import com.klp.domain.vo.WmsDeliveryWaybillVo;
|
||||
import com.klp.domain.vo.WmsReceivableVo;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
public class CrmContractOrderFinanceVo {
|
||||
|
||||
private List<CrmSalesObjectionVo> objectionList;
|
||||
|
||||
private List<WmsReceivableVo> receivableList;
|
||||
|
||||
// setWmsDeliveryWaybills
|
||||
private List<WmsDeliveryWaybillVo> wmsDeliveryWaybills;
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
package com.klp.crm.domain.vo;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.klp.common.annotation.ExcelDictFormat;
|
||||
import com.klp.common.convert.ExcelDictConvert;
|
||||
import lombok.Data;
|
||||
|
||||
|
||||
/**
|
||||
* 合同产品明细视图对象 crm_contract_product
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class CrmContractProductVo {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 合同产品主键ID
|
||||
*/
|
||||
@ExcelProperty(value = "合同产品主键ID")
|
||||
private Long contractProductId;
|
||||
|
||||
/**
|
||||
* 关联合同ID(绑定wms_contract表主键)
|
||||
*/
|
||||
@ExcelProperty(value = "关联合同ID", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "绑=定wms_contract表主键")
|
||||
private Long contractId;
|
||||
|
||||
/**
|
||||
* 产品名称
|
||||
*/
|
||||
@ExcelProperty(value = "产品名称")
|
||||
private String productName;
|
||||
|
||||
/**
|
||||
* 规格最小值(mm)
|
||||
*/
|
||||
@ExcelProperty(value = "规格最小值(mm)")
|
||||
private BigDecimal specMin;
|
||||
|
||||
/**
|
||||
* 规格最大值(mm)
|
||||
*/
|
||||
@ExcelProperty(value = "规格最大值(mm)")
|
||||
private BigDecimal specMax;
|
||||
|
||||
/**
|
||||
* 材质
|
||||
*/
|
||||
@ExcelProperty(value = "材质")
|
||||
private String material;
|
||||
|
||||
/**
|
||||
* 数量(吨)
|
||||
*/
|
||||
@ExcelProperty(value = "数量(吨)")
|
||||
private BigDecimal quantity;
|
||||
|
||||
/**
|
||||
* 含税单价(元/吨)
|
||||
*/
|
||||
@ExcelProperty(value = "含税单价(元/吨)")
|
||||
private BigDecimal taxInclusiveUnitPrice;
|
||||
|
||||
/**
|
||||
* 不含税单价(元/吨)
|
||||
*/
|
||||
@ExcelProperty(value = "不含税单价(元/吨)")
|
||||
private BigDecimal exTaxUnitPrice;
|
||||
|
||||
/**
|
||||
* 含税总额(元)
|
||||
*/
|
||||
@ExcelProperty(value = "含税总额(元)")
|
||||
private BigDecimal taxInclusiveAmount;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
180
klp-crm/src/main/java/com/klp/crm/domain/vo/CrmContractVo.java
Normal file
180
klp-crm/src/main/java/com/klp/crm/domain/vo/CrmContractVo.java
Normal file
@@ -0,0 +1,180 @@
|
||||
package com.klp.crm.domain.vo;
|
||||
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.klp.common.annotation.ExcelDictFormat;
|
||||
import com.klp.common.convert.ExcelDictConvert;
|
||||
import lombok.Data;
|
||||
|
||||
|
||||
/**
|
||||
* 合同信息视图对象 crm_contract
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class CrmContractVo {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 合同主键ID
|
||||
*/
|
||||
@ExcelProperty(value = "合同主键ID")
|
||||
private Long contractId;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
@ExcelProperty(value = "合同名称")
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 合同编号
|
||||
*/
|
||||
@ExcelProperty(value = "合同编号")
|
||||
private String contractNo;
|
||||
|
||||
/**
|
||||
* 供方
|
||||
*/
|
||||
@ExcelProperty(value = "供方")
|
||||
private String supplier;
|
||||
|
||||
/**
|
||||
* 需方
|
||||
*/
|
||||
@ExcelProperty(value = "需方")
|
||||
private String customer;
|
||||
|
||||
/**
|
||||
* 客户ID
|
||||
*/
|
||||
@ExcelProperty(value = "客户ID")
|
||||
private Long customerId;
|
||||
|
||||
/**
|
||||
* 签订时间
|
||||
*/
|
||||
@ExcelProperty(value = "签订时间")
|
||||
private Date signTime;
|
||||
|
||||
/**
|
||||
* 交货日期
|
||||
*/
|
||||
@ExcelProperty(value = "交货日期")
|
||||
private Date deliveryDate;
|
||||
/**
|
||||
* 签订地点
|
||||
*/
|
||||
@ExcelProperty(value = "签订地点")
|
||||
private String signLocation;
|
||||
|
||||
/**
|
||||
* 产品内容
|
||||
*/
|
||||
@ExcelProperty(value = "产品内容")
|
||||
private String productContent;
|
||||
|
||||
/**
|
||||
* 合同内容
|
||||
*/
|
||||
@ExcelProperty(value = "合同内容")
|
||||
private String contractContent;
|
||||
|
||||
/**
|
||||
* 供方地址
|
||||
*/
|
||||
@ExcelProperty(value = "供方地址")
|
||||
private String supplierAddress;
|
||||
|
||||
/**
|
||||
* 供方电话
|
||||
*/
|
||||
@ExcelProperty(value = "供方电话")
|
||||
private String supplierPhone;
|
||||
|
||||
/**
|
||||
* 供方开户行
|
||||
*/
|
||||
@ExcelProperty(value = "供方开户行")
|
||||
private String supplierBank;
|
||||
|
||||
/**
|
||||
* 供方账号
|
||||
*/
|
||||
@ExcelProperty(value = "供方账号")
|
||||
private String supplierAccount;
|
||||
|
||||
/**
|
||||
* 供方税号
|
||||
*/
|
||||
@ExcelProperty(value = "供方税号")
|
||||
private String supplierTaxNo;
|
||||
|
||||
/**
|
||||
* 需方地址
|
||||
*/
|
||||
@ExcelProperty(value = "需方地址")
|
||||
private String customerAddress;
|
||||
|
||||
/**
|
||||
* 需方电话
|
||||
*/
|
||||
@ExcelProperty(value = "需方电话")
|
||||
private String customerPhone;
|
||||
|
||||
/**
|
||||
* 需方开户行
|
||||
*/
|
||||
@ExcelProperty(value = "需方开户行")
|
||||
private String customerBank;
|
||||
|
||||
/**
|
||||
* 需方账号
|
||||
*/
|
||||
@ExcelProperty(value = "需方账号")
|
||||
private String customerAccount;
|
||||
|
||||
/**
|
||||
* 需方税号
|
||||
*/
|
||||
@ExcelProperty(value = "需方税号")
|
||||
private String customerTaxNo;
|
||||
|
||||
/**
|
||||
* 技术附件
|
||||
*/
|
||||
@ExcelProperty(value = "技术附件")
|
||||
private String techAnnex;
|
||||
|
||||
/**
|
||||
* 商务附件
|
||||
*/
|
||||
@ExcelProperty(value = "商务附件")
|
||||
private String businessAnnex;
|
||||
|
||||
/**
|
||||
* 排产函
|
||||
*/
|
||||
@ExcelProperty(value = "排产函")
|
||||
private String productionSchedule;
|
||||
|
||||
/**
|
||||
* 合同状态 0=草稿 1=生效 2=作废 3=已完成
|
||||
*/
|
||||
@ExcelProperty(value = "合同状态 0=草稿 1=生效 2=作废 3=已完成")
|
||||
private Long status;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
|
||||
}
|
||||
@@ -78,6 +78,12 @@ public class CrmCustomerVo {
|
||||
@ExcelDictFormat(readConverterExp = "多=条,需权限查看,JSON格式存储")
|
||||
private String bankInfo;
|
||||
|
||||
/**
|
||||
* 纳税人识别号/税号
|
||||
*/
|
||||
@ExcelProperty(value = "纳税人识别号/税号")
|
||||
private String taxNumber;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
|
||||
@@ -25,14 +25,14 @@ public class CrmOrderItemVo {
|
||||
*/
|
||||
@ExcelProperty(value = "正式订单明细ID", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "主=键")
|
||||
private String itemId;
|
||||
private Long itemId;
|
||||
|
||||
/**
|
||||
* 关联正式订单ID(外键)
|
||||
*/
|
||||
@ExcelProperty(value = "关联正式订单ID", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "外=键")
|
||||
private String orderId;
|
||||
private Long orderId;
|
||||
|
||||
/**
|
||||
* 产品类型
|
||||
@@ -95,6 +95,18 @@ public class CrmOrderItemVo {
|
||||
@ExcelProperty(value = "重量")
|
||||
private BigDecimal weight;
|
||||
|
||||
/**
|
||||
* 宽度公差
|
||||
*/
|
||||
@ExcelProperty(value = "宽度公差")
|
||||
private BigDecimal widthTolerance;
|
||||
|
||||
/**
|
||||
* 厚度公差
|
||||
*/
|
||||
@ExcelProperty(value = "厚度公差")
|
||||
private BigDecimal thicknessTolerance;
|
||||
|
||||
/**
|
||||
* 合同定价
|
||||
*/
|
||||
@@ -119,5 +131,40 @@ public class CrmOrderItemVo {
|
||||
@ExcelProperty(value = "排产批次")
|
||||
private String productionBatch;
|
||||
|
||||
/**
|
||||
* 表面处理
|
||||
*/
|
||||
@ExcelProperty(value = "表面处理")
|
||||
private String surfaceTreatment;
|
||||
|
||||
}
|
||||
/**
|
||||
* 切边要求
|
||||
*/
|
||||
@ExcelProperty(value = "切边要求")
|
||||
private String edgeCuttingReq;
|
||||
|
||||
/**
|
||||
* 包装要求
|
||||
*/
|
||||
@ExcelProperty(value = "包装要求")
|
||||
private String packagingReq;
|
||||
|
||||
/**
|
||||
* 宽度
|
||||
*/
|
||||
@ExcelProperty(value = "宽度")
|
||||
private BigDecimal width;
|
||||
|
||||
/**
|
||||
* 厚度
|
||||
*/
|
||||
@ExcelProperty(value = "厚度")
|
||||
private BigDecimal thickness;
|
||||
|
||||
/**
|
||||
* 用途
|
||||
*/
|
||||
@ExcelProperty(value = "用途")
|
||||
private String purpose;
|
||||
|
||||
}
|
||||
|
||||
@@ -2,12 +2,15 @@ package com.klp.crm.domain.vo;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.klp.common.annotation.ExcelDictFormat;
|
||||
import com.klp.common.convert.ExcelDictConvert;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import com.klp.domain.vo.WmsMaterialCoilVo;
|
||||
import lombok.Data;
|
||||
|
||||
|
||||
@@ -28,7 +31,7 @@ public class CrmOrderVo extends BaseEntity {
|
||||
*/
|
||||
@ExcelProperty(value = "订单ID", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "主=键")
|
||||
private String orderId;
|
||||
private Long orderId;
|
||||
|
||||
/**
|
||||
* 订单编号
|
||||
@@ -114,6 +117,168 @@ public class CrmOrderVo extends BaseEntity {
|
||||
@ExcelProperty(value = "合同号")
|
||||
private String contractCode;
|
||||
|
||||
/**
|
||||
* 合同名称
|
||||
*/
|
||||
@ExcelProperty(value = "合同名称")
|
||||
private String contractName;
|
||||
|
||||
/**
|
||||
* 供方
|
||||
*/
|
||||
@ExcelProperty(value = "供方")
|
||||
private String supplier;
|
||||
|
||||
/**
|
||||
* 需方
|
||||
*/
|
||||
@ExcelProperty(value = "需方")
|
||||
private String customer;
|
||||
|
||||
/**
|
||||
* 签订时间
|
||||
*/
|
||||
@ExcelProperty(value = "签订时间")
|
||||
private Date signTime;
|
||||
|
||||
/**
|
||||
* 签订地点
|
||||
*/
|
||||
@ExcelProperty(value = "签订地点")
|
||||
private String signLocation;
|
||||
|
||||
/**
|
||||
* 产品内容
|
||||
*/
|
||||
@ExcelProperty(value = "产品内容")
|
||||
private String productContent;
|
||||
|
||||
/**
|
||||
* 合同内容
|
||||
*/
|
||||
@ExcelProperty(value = "合同内容")
|
||||
private String contractContent;
|
||||
|
||||
/**
|
||||
* 供方地址
|
||||
*/
|
||||
@ExcelProperty(value = "供方地址")
|
||||
private String supplierAddress;
|
||||
|
||||
/**
|
||||
* 供方电话
|
||||
*/
|
||||
@ExcelProperty(value = "供方电话")
|
||||
private String supplierPhone;
|
||||
|
||||
/**
|
||||
* 供方开户行
|
||||
*/
|
||||
@ExcelProperty(value = "供方开户行")
|
||||
private String supplierBank;
|
||||
|
||||
/**
|
||||
* 供方账号
|
||||
*/
|
||||
@ExcelProperty(value = "供方账号")
|
||||
private String supplierAccount;
|
||||
|
||||
/**
|
||||
* 供方税号
|
||||
*/
|
||||
@ExcelProperty(value = "供方税号")
|
||||
private String supplierTaxNo;
|
||||
|
||||
/**
|
||||
* 需方地址
|
||||
*/
|
||||
@ExcelProperty(value = "需方地址")
|
||||
private String customerAddress;
|
||||
|
||||
/**
|
||||
* 需方电话
|
||||
*/
|
||||
@ExcelProperty(value = "需方电话")
|
||||
private String customerPhone;
|
||||
|
||||
/**
|
||||
* 需方开户行
|
||||
*/
|
||||
@ExcelProperty(value = "需方开户行")
|
||||
private String customerBank;
|
||||
|
||||
/**
|
||||
* 需方账号
|
||||
*/
|
||||
@ExcelProperty(value = "需方账号")
|
||||
private String customerAccount;
|
||||
|
||||
/**
|
||||
* 需方税号
|
||||
*/
|
||||
@ExcelProperty(value = "需方税号")
|
||||
private String customerTaxNo;
|
||||
|
||||
/**
|
||||
* 技术附件
|
||||
*/
|
||||
@ExcelProperty(value = "技术附件")
|
||||
private String techAnnex;
|
||||
|
||||
/**
|
||||
* 商务附件
|
||||
*/
|
||||
@ExcelProperty(value = "商务附件")
|
||||
private String businessAnnex;
|
||||
|
||||
/**
|
||||
* 排产函
|
||||
*/
|
||||
@ExcelProperty(value = "排产函")
|
||||
private String productionSchedule;
|
||||
|
||||
/**
|
||||
* 算单价备注
|
||||
*/
|
||||
@ExcelProperty(value = "算单价备注")
|
||||
private String unitPriceRemark;
|
||||
|
||||
/**
|
||||
* 应付定金(万元)
|
||||
*/
|
||||
@ExcelProperty(value = "应付定金(万元)")
|
||||
private BigDecimal depositPayable;
|
||||
|
||||
/**
|
||||
* 已付定金(万元)
|
||||
*/
|
||||
@ExcelProperty(value = "已付定金(万元)")
|
||||
private BigDecimal depositPaid;
|
||||
|
||||
/**
|
||||
* 定金比例(%)
|
||||
*/
|
||||
@ExcelProperty(value = "定金比例(%)")
|
||||
private BigDecimal depositRatio;
|
||||
|
||||
/**
|
||||
* 合同状态 0=草稿 1=生效 2=作废 3=已完成
|
||||
*/
|
||||
@ExcelProperty(value = "合同状态")
|
||||
private Long status;
|
||||
|
||||
/**
|
||||
* 关联合同ID(wms_contract.contract_id)
|
||||
*/
|
||||
@ExcelProperty(value = "关联合同ID")
|
||||
private Long contractId;
|
||||
|
||||
/**
|
||||
* 附件(多个文件URL用逗号分隔)
|
||||
*/
|
||||
@ExcelProperty(value = "附件")
|
||||
private String annexFiles;
|
||||
|
||||
|
||||
// @ExcelProperty(value = "客户编号")
|
||||
private String customerCode;
|
||||
@@ -130,4 +295,8 @@ public class CrmOrderVo extends BaseEntity {
|
||||
private String createByName;
|
||||
//更新人
|
||||
private String updateByName;
|
||||
/**
|
||||
* 关联的钢卷列表
|
||||
*/
|
||||
private List<WmsMaterialCoilVo> coilList;
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ public class CrmSalesReportVo {
|
||||
/**
|
||||
* 订单ID
|
||||
*/
|
||||
private String orderId;
|
||||
private Long orderId;
|
||||
|
||||
/**
|
||||
* 订单编号
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.klp.crm.mapper;
|
||||
|
||||
import com.klp.crm.domain.CrmContract;
|
||||
import com.klp.crm.domain.vo.CrmContractVo;
|
||||
import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* 合同信息Mapper接口
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
public interface CrmContractMapper extends BaseMapperPlus<CrmContractMapper, CrmContract, CrmContractVo> {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
package com.klp.crm.mapper;
|
||||
|
||||
import com.klp.crm.domain.CrmContractProduct;
|
||||
import com.klp.crm.domain.vo.CrmContractProductVo;
|
||||
import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* 合同产品明细Mapper接口
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
public interface CrmContractProductMapper extends BaseMapperPlus<CrmContractProductMapper, CrmContractProduct, CrmContractProductVo> {
|
||||
|
||||
}
|
||||
@@ -21,5 +21,5 @@ public interface CrmOrderItemMapper extends BaseMapperPlus<CrmOrderItemMapper, C
|
||||
* @param orderIds 订单ID列表
|
||||
* @return 订单明细列表
|
||||
*/
|
||||
List<CrmOrderItem> selectOrderItemsByOrderIds(@Param("orderIds") List<String> orderIds);
|
||||
List<CrmOrderItem> selectOrderItemsByOrderIds(@Param("orderIds") List<Long> orderIds);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.klp.crm.service;
|
||||
|
||||
import com.klp.crm.domain.CrmContractProduct;
|
||||
import com.klp.crm.domain.vo.CrmContractProductVo;
|
||||
import com.klp.crm.domain.bo.CrmContractProductBo;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 合同产品明细Service接口
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
public interface ICrmContractProductService {
|
||||
|
||||
/**
|
||||
* 查询合同产品明细
|
||||
*/
|
||||
CrmContractProductVo queryById(Long contractProductId);
|
||||
|
||||
/**
|
||||
* 查询合同产品明细列表
|
||||
*/
|
||||
TableDataInfo<CrmContractProductVo> queryPageList(CrmContractProductBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询合同产品明细列表
|
||||
*/
|
||||
List<CrmContractProductVo> queryList(CrmContractProductBo bo);
|
||||
|
||||
/**
|
||||
* 新增合同产品明细
|
||||
*/
|
||||
Boolean insertByBo(CrmContractProductBo bo);
|
||||
|
||||
/**
|
||||
* 修改合同产品明细
|
||||
*/
|
||||
Boolean updateByBo(CrmContractProductBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除合同产品明细信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.klp.crm.service;
|
||||
|
||||
import com.klp.crm.domain.CrmContract;
|
||||
import com.klp.crm.domain.vo.CrmContractVo;
|
||||
import com.klp.crm.domain.bo.CrmContractBo;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 合同信息Service接口
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
public interface ICrmContractService {
|
||||
|
||||
/**
|
||||
* 查询合同信息
|
||||
*/
|
||||
CrmContractVo queryById(Long contractId);
|
||||
|
||||
/**
|
||||
* 查询合同信息列表
|
||||
*/
|
||||
TableDataInfo<CrmContractVo> queryPageList(CrmContractBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询合同信息列表
|
||||
*/
|
||||
List<CrmContractVo> queryList(CrmContractBo bo);
|
||||
|
||||
/**
|
||||
* 新增合同信息
|
||||
*/
|
||||
Boolean insertByBo(CrmContractBo bo);
|
||||
|
||||
/**
|
||||
* 修改合同信息
|
||||
*/
|
||||
Boolean updateByBo(CrmContractBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除合同信息信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
||||
@@ -9,6 +9,10 @@ import com.klp.common.core.domain.PageQuery;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import com.klp.crm.domain.vo.CrmContractOrderFinanceVo;
|
||||
import com.klp.domain.vo.WmsMaterialCoilVo;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 正式订单明细Service接口
|
||||
*
|
||||
@@ -46,4 +50,29 @@ public interface ICrmOrderItemService {
|
||||
* 校验并批量删除正式订单明细信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
|
||||
|
||||
/**
|
||||
* 根据合同ID查询下属订单的异议和财务信息
|
||||
*/
|
||||
CrmContractOrderFinanceVo queryFinanceAndObjectionByContractId(Long contractId);
|
||||
|
||||
/**
|
||||
* 根据订单ID查询发货单配卷
|
||||
*/
|
||||
List<WmsMaterialCoilVo> queryCoilsByOrderId(Long orderId);
|
||||
|
||||
/**
|
||||
* 根据合同ID查询发货单配卷
|
||||
*/
|
||||
List<WmsMaterialCoilVo> queryCoilsByContractId(Long contractId);
|
||||
|
||||
/**
|
||||
* 根据客户ID查询下属订单的异议和财务信息
|
||||
*/
|
||||
CrmContractOrderFinanceVo queryFinanceAndObjectionByCustomerId(String customerId);
|
||||
|
||||
/**
|
||||
* 根据客户ID查询发货单配卷
|
||||
*/
|
||||
List<WmsMaterialCoilVo> queryCoilsByCustomerId(String customerId);
|
||||
}
|
||||
|
||||
@@ -22,6 +22,11 @@ public interface ICrmOrderService {
|
||||
*/
|
||||
CrmOrderVo queryById(String orderId);
|
||||
|
||||
/**
|
||||
* 根据ID列表查询正式订单
|
||||
*/
|
||||
List<CrmOrderVo> queryByIds(List<Long> orderIds);
|
||||
|
||||
/**
|
||||
* 查询正式订单主列表
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,117 @@
|
||||
package com.klp.crm.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.klp.crm.domain.bo.CrmContractProductBo;
|
||||
import com.klp.crm.domain.vo.CrmContractProductVo;
|
||||
import com.klp.crm.domain.CrmContractProduct;
|
||||
import com.klp.crm.mapper.CrmContractProductMapper;
|
||||
import com.klp.crm.service.ICrmContractProductService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 合同产品明细Service业务层处理
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class CrmContractProductServiceImpl implements ICrmContractProductService {
|
||||
|
||||
private final CrmContractProductMapper baseMapper;
|
||||
|
||||
/**
|
||||
* 查询合同产品明细
|
||||
*/
|
||||
@Override
|
||||
public CrmContractProductVo queryById(Long contractProductId){
|
||||
return baseMapper.selectVoById(contractProductId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询合同产品明细列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<CrmContractProductVo> queryPageList(CrmContractProductBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<CrmContractProduct> lqw = buildQueryWrapper(bo);
|
||||
Page<CrmContractProductVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询合同产品明细列表
|
||||
*/
|
||||
@Override
|
||||
public List<CrmContractProductVo> queryList(CrmContractProductBo bo) {
|
||||
LambdaQueryWrapper<CrmContractProduct> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<CrmContractProduct> buildQueryWrapper(CrmContractProductBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<CrmContractProduct> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(bo.getContractId() != null, CrmContractProduct::getContractId, bo.getContractId());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getProductName()), CrmContractProduct::getProductName, bo.getProductName());
|
||||
lqw.eq(bo.getSpecMin() != null, CrmContractProduct::getSpecMin, bo.getSpecMin());
|
||||
lqw.eq(bo.getSpecMax() != null, CrmContractProduct::getSpecMax, bo.getSpecMax());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getMaterial()), CrmContractProduct::getMaterial, bo.getMaterial());
|
||||
lqw.eq(bo.getQuantity() != null, CrmContractProduct::getQuantity, bo.getQuantity());
|
||||
lqw.eq(bo.getTaxInclusiveUnitPrice() != null, CrmContractProduct::getTaxInclusiveUnitPrice, bo.getTaxInclusiveUnitPrice());
|
||||
lqw.eq(bo.getExTaxUnitPrice() != null, CrmContractProduct::getExTaxUnitPrice, bo.getExTaxUnitPrice());
|
||||
lqw.eq(bo.getTaxInclusiveAmount() != null, CrmContractProduct::getTaxInclusiveAmount, bo.getTaxInclusiveAmount());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增合同产品明细
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(CrmContractProductBo bo) {
|
||||
CrmContractProduct add = BeanUtil.toBean(bo, CrmContractProduct.class);
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setContractProductId(add.getContractProductId());
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改合同产品明细
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(CrmContractProductBo bo) {
|
||||
CrmContractProduct update = BeanUtil.toBean(bo, CrmContractProduct.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(CrmContractProduct entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除合同产品明细
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
package com.klp.crm.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.klp.crm.domain.bo.CrmContractBo;
|
||||
import com.klp.crm.domain.vo.CrmContractVo;
|
||||
import com.klp.crm.domain.CrmContract;
|
||||
import com.klp.crm.mapper.CrmContractMapper;
|
||||
import com.klp.crm.service.ICrmContractService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 合同信息Service业务层处理
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-03-30
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class CrmContractServiceImpl implements ICrmContractService {
|
||||
|
||||
private final CrmContractMapper baseMapper;
|
||||
|
||||
/**
|
||||
* 查询合同信息
|
||||
*/
|
||||
@Override
|
||||
public CrmContractVo queryById(Long contractId){
|
||||
return baseMapper.selectVoById(contractId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询合同信息列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<CrmContractVo> queryPageList(CrmContractBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<CrmContract> lqw = buildQueryWrapper(bo);
|
||||
Page<CrmContractVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询合同信息列表
|
||||
*/
|
||||
@Override
|
||||
public List<CrmContractVo> queryList(CrmContractBo bo) {
|
||||
LambdaQueryWrapper<CrmContract> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<CrmContract> buildQueryWrapper(CrmContractBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<CrmContract> lqw = Wrappers.lambdaQuery();
|
||||
if (StringUtils.isNotBlank(bo.getKeyword())) {
|
||||
lqw.and(w -> w.like(CrmContract::getContractName, bo.getKeyword())
|
||||
.or().like(CrmContract::getContractNo, bo.getKeyword())
|
||||
.or().like(CrmContract::getSupplier, bo.getKeyword())
|
||||
.or().like(CrmContract::getCustomer, bo.getKeyword())
|
||||
.or().like(CrmContract::getSignLocation, bo.getKeyword())
|
||||
.or().like(CrmContract::getProductContent, bo.getKeyword())
|
||||
.or().like(CrmContract::getContractContent, bo.getKeyword())
|
||||
.or().like(CrmContract::getSupplierAddress, bo.getKeyword())
|
||||
.or().like(CrmContract::getSupplierPhone, bo.getKeyword())
|
||||
.or().like(CrmContract::getSupplierBank, bo.getKeyword())
|
||||
.or().like(CrmContract::getSupplierAccount, bo.getKeyword())
|
||||
.or().like(CrmContract::getSupplierTaxNo, bo.getKeyword())
|
||||
.or().like(CrmContract::getCustomerAddress, bo.getKeyword())
|
||||
.or().like(CrmContract::getCustomerPhone, bo.getKeyword())
|
||||
.or().like(CrmContract::getCustomerBank, bo.getKeyword())
|
||||
.or().like(CrmContract::getCustomerAccount, bo.getKeyword())
|
||||
.or().like(CrmContract::getCustomerTaxNo, bo.getKeyword())
|
||||
.or().like(CrmContract::getRemark, bo.getKeyword()));
|
||||
}
|
||||
lqw.like(StringUtils.isNotBlank(bo.getContractName()), CrmContract::getContractName, bo.getContractName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getContractNo()), CrmContract::getContractNo, bo.getContractNo());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getSupplier()), CrmContract::getSupplier, bo.getSupplier());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCustomer()), CrmContract::getCustomer, bo.getCustomer());
|
||||
lqw.eq(bo.getCustomerId() != null, CrmContract::getCustomerId, bo.getCustomerId());
|
||||
lqw.eq(bo.getSignTime() != null, CrmContract::getSignTime, bo.getSignTime());
|
||||
lqw.eq(bo.getDeliveryDate() != null, CrmContract::getDeliveryDate, bo.getDeliveryDate());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getSignLocation()), CrmContract::getSignLocation, bo.getSignLocation());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProductContent()), CrmContract::getProductContent, bo.getProductContent());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getContractContent()), CrmContract::getContractContent, bo.getContractContent());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getSupplierAddress()), CrmContract::getSupplierAddress, bo.getSupplierAddress());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getSupplierPhone()), CrmContract::getSupplierPhone, bo.getSupplierPhone());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getSupplierBank()), CrmContract::getSupplierBank, bo.getSupplierBank());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getSupplierAccount()), CrmContract::getSupplierAccount, bo.getSupplierAccount());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getSupplierTaxNo()), CrmContract::getSupplierTaxNo, bo.getSupplierTaxNo());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCustomerAddress()), CrmContract::getCustomerAddress, bo.getCustomerAddress());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCustomerPhone()), CrmContract::getCustomerPhone, bo.getCustomerPhone());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCustomerBank()), CrmContract::getCustomerBank, bo.getCustomerBank());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCustomerAccount()), CrmContract::getCustomerAccount, bo.getCustomerAccount());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCustomerTaxNo()), CrmContract::getCustomerTaxNo, bo.getCustomerTaxNo());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getTechAnnex()), CrmContract::getTechAnnex, bo.getTechAnnex());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getBusinessAnnex()), CrmContract::getBusinessAnnex, bo.getBusinessAnnex());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProductionSchedule()), CrmContract::getProductionSchedule, bo.getProductionSchedule());
|
||||
lqw.eq(bo.getStatus() != null, CrmContract::getStatus, bo.getStatus());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增合同信息
|
||||
*/
|
||||
@Override
|
||||
public Boolean insertByBo(CrmContractBo bo) {
|
||||
CrmContract add = BeanUtil.toBean(bo, CrmContract.class);
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setContractId(add.getContractId());
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改合同信息
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(CrmContractBo bo) {
|
||||
CrmContract update = BeanUtil.toBean(bo, CrmContract.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(CrmContract entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除合同信息
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
@@ -61,14 +61,27 @@ public class CrmCustomerServiceImpl implements ICrmCustomerService {
|
||||
private LambdaQueryWrapper<CrmCustomer> buildQueryWrapper(CrmCustomerBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<CrmCustomer> lqw = Wrappers.lambdaQuery();
|
||||
if (StringUtils.isNotBlank(bo.getKeyword())) {
|
||||
lqw.and(w -> w.like(CrmCustomer::getCustomerCode, bo.getKeyword())
|
||||
.or().like(CrmCustomer::getCompanyName, bo.getKeyword())
|
||||
.or().like(CrmCustomer::getContactPerson, bo.getKeyword())
|
||||
.or().like(CrmCustomer::getContactWay, bo.getKeyword())
|
||||
.or().like(CrmCustomer::getIndustry, bo.getKeyword())
|
||||
.or().like(CrmCustomer::getCustomerLevel, bo.getKeyword())
|
||||
.or().like(CrmCustomer::getAddress, bo.getKeyword())
|
||||
.or().like(CrmCustomer::getBankInfo, bo.getKeyword())
|
||||
.or().like(CrmCustomer::getTaxNumber, bo.getKeyword())
|
||||
.or().like(CrmCustomer::getRemark, bo.getKeyword()));
|
||||
}
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCustomerCode()), CrmCustomer::getCustomerCode, bo.getCustomerCode());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), CrmCustomer::getCompanyName, bo.getCompanyName());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getContactPerson()), CrmCustomer::getContactPerson, bo.getContactPerson());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getContactWay()), CrmCustomer::getContactWay, bo.getContactWay());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getContactPerson()), CrmCustomer::getContactPerson, bo.getContactPerson());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getContactWay()), CrmCustomer::getContactWay, bo.getContactWay());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getIndustry()), CrmCustomer::getIndustry, bo.getIndustry());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCustomerLevel()), CrmCustomer::getCustomerLevel, bo.getCustomerLevel());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getAddress()), CrmCustomer::getAddress, bo.getAddress());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getBankInfo()), CrmCustomer::getBankInfo, bo.getBankInfo());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getAddress()), CrmCustomer::getAddress, bo.getAddress());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getBankInfo()), CrmCustomer::getBankInfo, bo.getBankInfo());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getTaxNumber()), CrmCustomer::getTaxNumber, bo.getTaxNumber());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
|
||||
@@ -7,17 +7,35 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import com.klp.crm.domain.CrmSalesObjection;
|
||||
import com.klp.domain.WmsMaterialCoil;
|
||||
import com.klp.domain.WmsReceivable;
|
||||
import com.klp.domain.vo.WmsDeliveryWaybillVo;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.klp.crm.domain.bo.CrmOrderItemBo;
|
||||
import com.klp.crm.domain.vo.CrmOrderItemVo;
|
||||
import com.klp.crm.domain.vo.CrmContractOrderFinanceVo;
|
||||
import com.klp.crm.domain.vo.CrmSalesObjectionVo;
|
||||
import com.klp.domain.vo.WmsReceivableVo;
|
||||
import com.klp.domain.vo.WmsMaterialCoilVo;
|
||||
import com.klp.domain.bo.WmsMaterialCoilBo;
|
||||
import com.klp.crm.domain.CrmOrderItem;
|
||||
import com.klp.crm.domain.CrmOrder;
|
||||
import com.klp.domain.WmsDeliveryWaybill;
|
||||
import com.klp.domain.WmsDeliveryWaybillDetail;
|
||||
import com.klp.crm.mapper.CrmOrderItemMapper;
|
||||
import com.klp.crm.mapper.CrmOrderMapper;
|
||||
import com.klp.crm.mapper.CrmSalesObjectionMapper;
|
||||
import com.klp.crm.service.ICrmOrderItemService;
|
||||
import com.klp.mapper.WmsReceivableMapper;
|
||||
import com.klp.mapper.WmsDeliveryWaybillMapper;
|
||||
import com.klp.mapper.WmsDeliveryWaybillDetailMapper;
|
||||
import com.klp.service.IWmsMaterialCoilService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 正式订单明细Service业务层处理
|
||||
@@ -30,12 +48,18 @@ import java.util.Collection;
|
||||
public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
|
||||
|
||||
private final CrmOrderItemMapper baseMapper;
|
||||
private final CrmOrderMapper crmOrderMapper;
|
||||
private final CrmSalesObjectionMapper crmSalesObjectionMapper;
|
||||
private final WmsReceivableMapper wmsReceivableMapper;
|
||||
private final WmsDeliveryWaybillMapper wmsDeliveryWaybillMapper;
|
||||
private final WmsDeliveryWaybillDetailMapper wmsDeliveryWaybillDetailMapper;
|
||||
private final IWmsMaterialCoilService iWmsMaterialCoilService;
|
||||
|
||||
/**
|
||||
* 查询正式订单明细
|
||||
*/
|
||||
@Override
|
||||
public CrmOrderItemVo queryById(String itemId){
|
||||
public CrmOrderItemVo queryById(String itemId) {
|
||||
return baseMapper.selectVoById(itemId);
|
||||
}
|
||||
|
||||
@@ -61,7 +85,7 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
|
||||
private LambdaQueryWrapper<CrmOrderItem> buildQueryWrapper(CrmOrderItemBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<CrmOrderItem> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getOrderId()), CrmOrderItem::getOrderId, bo.getOrderId());
|
||||
lqw.eq(bo.getOrderId() != null, CrmOrderItem::getOrderId, bo.getOrderId());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProductType()), CrmOrderItem::getProductType, bo.getProductType());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getRawMaterialSpec()), CrmOrderItem::getRawMaterialSpec, bo.getRawMaterialSpec());
|
||||
lqw.eq(bo.getProductNum() != null, CrmOrderItem::getProductNum, bo.getProductNum());
|
||||
@@ -71,10 +95,18 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getMaterial()), CrmOrderItem::getMaterial, bo.getMaterial());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getGrade()), CrmOrderItem::getGrade, bo.getGrade());
|
||||
lqw.eq(bo.getWeight() != null, CrmOrderItem::getWeight, bo.getWeight());
|
||||
lqw.eq(bo.getWidthTolerance() != null, CrmOrderItem::getWidthTolerance, bo.getWidthTolerance());
|
||||
lqw.eq(bo.getThicknessTolerance() != null, CrmOrderItem::getThicknessTolerance, bo.getThicknessTolerance());
|
||||
lqw.eq(bo.getContractPrice() != null, CrmOrderItem::getContractPrice, bo.getContractPrice());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getCustomizer()), CrmOrderItem::getCustomizer, bo.getCustomizer());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getShipper()), CrmOrderItem::getShipper, bo.getShipper());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProductionBatch()), CrmOrderItem::getProductionBatch, bo.getProductionBatch());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getSurfaceTreatment()), CrmOrderItem::getSurfaceTreatment, bo.getSurfaceTreatment());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getEdgeCuttingReq()), CrmOrderItem::getEdgeCuttingReq, bo.getEdgeCuttingReq());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getPackagingReq()), CrmOrderItem::getPackagingReq, bo.getPackagingReq());
|
||||
lqw.eq(bo.getWidth() != null, CrmOrderItem::getWidth, bo.getWidth());
|
||||
lqw.eq(bo.getThickness() != null, CrmOrderItem::getThickness, bo.getThickness());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getPurpose()), CrmOrderItem::getPurpose, bo.getPurpose());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
@@ -106,7 +138,7 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(CrmOrderItem entity){
|
||||
private void validEntityBeforeSave(CrmOrderItem entity) {
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
@@ -115,9 +147,198 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
if (isValid) {
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public CrmContractOrderFinanceVo queryFinanceAndObjectionByContractId(Long contractId) {
|
||||
CrmContractOrderFinanceVo result = new CrmContractOrderFinanceVo();
|
||||
|
||||
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
|
||||
orderWrapper.eq(CrmOrder::getContractId, contractId);
|
||||
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
|
||||
|
||||
if (orders == null || orders.isEmpty()) {
|
||||
return result;
|
||||
}
|
||||
|
||||
List<Long> orderIds = orders.stream()
|
||||
.map(CrmOrder::getOrderId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
LambdaQueryWrapper<CrmSalesObjection> objectionWrapper = new LambdaQueryWrapper<>();
|
||||
objectionWrapper.in(CrmSalesObjection::getOrderId, orderIds);
|
||||
List<CrmSalesObjectionVo> objectionList = crmSalesObjectionMapper.selectVoList(objectionWrapper);
|
||||
result.setObjectionList(objectionList);
|
||||
|
||||
LambdaQueryWrapper<com.klp.domain.WmsReceivable> receivableWrapper = new LambdaQueryWrapper<>();
|
||||
receivableWrapper.in(WmsReceivable::getOrderId, orderIds);
|
||||
List<WmsReceivableVo> receivableList = wmsReceivableMapper.selectVoList(receivableWrapper);
|
||||
result.setReceivableList(receivableList);
|
||||
|
||||
LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>();
|
||||
waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds);
|
||||
List<WmsDeliveryWaybillVo> wmsDeliveryWaybills = wmsDeliveryWaybillMapper.selectVoList(waybillWrapper);
|
||||
result.setWmsDeliveryWaybills(wmsDeliveryWaybills);
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WmsMaterialCoilVo> queryCoilsByOrderId(Long orderId) {
|
||||
LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>();
|
||||
waybillWrapper.eq(WmsDeliveryWaybill::getOrderId, orderId);
|
||||
List<WmsDeliveryWaybill> waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper);
|
||||
|
||||
if (waybills == null || waybills.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<Long> waybillIds = waybills.stream()
|
||||
.map(WmsDeliveryWaybill::getWaybillId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
LambdaQueryWrapper<WmsDeliveryWaybillDetail> detailWrapper = new LambdaQueryWrapper<>();
|
||||
detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds);
|
||||
List<WmsDeliveryWaybillDetail> details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper);
|
||||
|
||||
if (details == null || details.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
String coilIds = details.stream()
|
||||
.map(WmsDeliveryWaybillDetail::getCoilId)
|
||||
.map(String::valueOf)
|
||||
.collect(Collectors.joining(","));
|
||||
|
||||
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
|
||||
coilBo.setCoilIds(coilIds);
|
||||
return iWmsMaterialCoilService.queryList(coilBo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WmsMaterialCoilVo> queryCoilsByContractId(Long contractId) {
|
||||
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
|
||||
orderWrapper.eq(CrmOrder::getContractId, contractId);
|
||||
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
|
||||
|
||||
if (orders == null || orders.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<Long> orderIds = orders.stream()
|
||||
.map(CrmOrder::getOrderId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>();
|
||||
waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds);
|
||||
List<WmsDeliveryWaybill> waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper);
|
||||
|
||||
if (waybills == null || waybills.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<Long> waybillIds = waybills.stream()
|
||||
.map(WmsDeliveryWaybill::getWaybillId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
LambdaQueryWrapper<WmsDeliveryWaybillDetail> detailWrapper = new LambdaQueryWrapper<>();
|
||||
detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds);
|
||||
List<WmsDeliveryWaybillDetail> details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper);
|
||||
|
||||
if (details == null || details.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
String coilIds = details.stream()
|
||||
.map(WmsDeliveryWaybillDetail::getCoilId)
|
||||
.map(String::valueOf)
|
||||
.collect(Collectors.joining(","));
|
||||
|
||||
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
|
||||
coilBo.setCoilIds(coilIds);
|
||||
return iWmsMaterialCoilService.queryList(coilBo);
|
||||
}
|
||||
|
||||
@Override
|
||||
public CrmContractOrderFinanceVo queryFinanceAndObjectionByCustomerId(String customerId) {
|
||||
CrmContractOrderFinanceVo result = new CrmContractOrderFinanceVo();
|
||||
|
||||
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
|
||||
orderWrapper.eq(CrmOrder::getCustomerId, customerId);
|
||||
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
|
||||
|
||||
if (orders == null || orders.isEmpty()) {
|
||||
return result;
|
||||
}
|
||||
|
||||
List<Long> orderIds = orders.stream()
|
||||
.map(CrmOrder::getOrderId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
LambdaQueryWrapper<CrmSalesObjection> objectionWrapper = new LambdaQueryWrapper<>();
|
||||
objectionWrapper.in(CrmSalesObjection::getOrderId, orderIds);
|
||||
List<CrmSalesObjectionVo> objectionList = crmSalesObjectionMapper.selectVoList(objectionWrapper);
|
||||
result.setObjectionList(objectionList);
|
||||
|
||||
LambdaQueryWrapper<com.klp.domain.WmsReceivable> receivableWrapper = new LambdaQueryWrapper<>();
|
||||
receivableWrapper.in(WmsReceivable::getOrderId, orderIds);
|
||||
List<WmsReceivableVo> receivableList = wmsReceivableMapper.selectVoList(receivableWrapper);
|
||||
result.setReceivableList(receivableList);
|
||||
|
||||
LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>();
|
||||
waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds);
|
||||
List<WmsDeliveryWaybillVo> wmsDeliveryWaybills = wmsDeliveryWaybillMapper.selectVoList(waybillWrapper);
|
||||
result.setWmsDeliveryWaybills(wmsDeliveryWaybills);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WmsMaterialCoilVo> queryCoilsByCustomerId(String customerId) {
|
||||
LambdaQueryWrapper<CrmOrder> orderWrapper = new LambdaQueryWrapper<>();
|
||||
orderWrapper.eq(CrmOrder::getCustomerId, customerId);
|
||||
List<CrmOrder> orders = crmOrderMapper.selectList(orderWrapper);
|
||||
|
||||
if (orders == null || orders.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<Long> orderIds = orders.stream()
|
||||
.map(CrmOrder::getOrderId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
LambdaQueryWrapper<WmsDeliveryWaybill> waybillWrapper = new LambdaQueryWrapper<>();
|
||||
waybillWrapper.in(WmsDeliveryWaybill::getOrderId, orderIds);
|
||||
List<WmsDeliveryWaybill> waybills = wmsDeliveryWaybillMapper.selectList(waybillWrapper);
|
||||
|
||||
if (waybills == null || waybills.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<Long> waybillIds = waybills.stream()
|
||||
.map(WmsDeliveryWaybill::getWaybillId)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
LambdaQueryWrapper<WmsDeliveryWaybillDetail> detailWrapper = new LambdaQueryWrapper<>();
|
||||
detailWrapper.in(WmsDeliveryWaybillDetail::getWaybillId, waybillIds);
|
||||
List<WmsDeliveryWaybillDetail> details = wmsDeliveryWaybillDetailMapper.selectList(detailWrapper);
|
||||
|
||||
if (details == null || details.isEmpty()) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
String coilIds = details.stream()
|
||||
.map(WmsDeliveryWaybillDetail::getCoilId)
|
||||
.map(String::valueOf)
|
||||
.collect(Collectors.joining(","));
|
||||
|
||||
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
|
||||
coilBo.setCoilIds(coilIds);
|
||||
return iWmsMaterialCoilService.queryList(coilBo);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import com.klp.crm.domain.vo.CrmOrderOperationTraceVo;
|
||||
import com.klp.mapper.WmsCoilContractRelMapper;
|
||||
import com.klp.system.service.ISysUserService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -17,6 +18,11 @@ import com.klp.crm.domain.vo.CrmOrderVo;
|
||||
import com.klp.crm.domain.CrmOrder;
|
||||
import com.klp.crm.mapper.CrmOrderMapper;
|
||||
import com.klp.crm.service.ICrmOrderService;
|
||||
import com.klp.domain.WmsCoilContractRel;
|
||||
import com.klp.domain.bo.WmsMaterialCoilBo;
|
||||
import com.klp.domain.vo.WmsMaterialCoilVo;
|
||||
import com.klp.service.IWmsCoilContractRelService;
|
||||
import com.klp.service.IWmsMaterialCoilService;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -35,6 +41,10 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
|
||||
|
||||
private final ISysUserService userService;
|
||||
|
||||
private final WmsCoilContractRelMapper coilContractRelMapper;
|
||||
|
||||
private final IWmsMaterialCoilService materialCoilService;
|
||||
|
||||
/**
|
||||
* 查询正式订单主
|
||||
*/
|
||||
@@ -43,6 +53,19 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
|
||||
return baseMapper.selectVoById(orderId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID列表查询正式订单
|
||||
*/
|
||||
@Override
|
||||
public List<CrmOrderVo> queryByIds(List<Long> orderIds) {
|
||||
if (orderIds == null || orderIds.isEmpty()) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
LambdaQueryWrapper<CrmOrder> lqw = Wrappers.lambdaQuery();
|
||||
lqw.in(CrmOrder::getOrderId, orderIds);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询正式订单主列表
|
||||
*/
|
||||
@@ -76,12 +99,75 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 查询订单关联的钢卷ID列表
|
||||
List<Long> contractIds = records.stream()
|
||||
.map(CrmOrderVo::getOrderId)
|
||||
.filter(Objects::nonNull)
|
||||
.distinct()
|
||||
.collect(Collectors.toList());
|
||||
|
||||
if (!contractIds.isEmpty()) {
|
||||
// 批量查询钢卷与合同关联关系
|
||||
LambdaQueryWrapper<WmsCoilContractRel> coilQw = Wrappers.lambdaQuery();
|
||||
coilQw.in(WmsCoilContractRel::getContractId, contractIds);
|
||||
coilQw.eq(WmsCoilContractRel::getDelFlag, 0);
|
||||
List<WmsCoilContractRel> coilRels = coilContractRelMapper.selectList(coilQw);
|
||||
|
||||
// 按contractId分组,收集coilId列表
|
||||
Map<Long, List<Long>> coilIdMap = coilRels.stream()
|
||||
.filter(rel -> rel.getContractId() != null && rel.getCoilId() != null)
|
||||
.collect(Collectors.groupingBy(
|
||||
WmsCoilContractRel::getContractId,
|
||||
Collectors.mapping(WmsCoilContractRel::getCoilId, Collectors.toList())
|
||||
));
|
||||
|
||||
// 查询所有相关钢卷的详细信息
|
||||
Set<Long> allCoilIds = coilIdMap.values().stream()
|
||||
.flatMap(List::stream)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
Map<Long, WmsMaterialCoilVo> coilVoMap = Collections.emptyMap();
|
||||
if (!allCoilIds.isEmpty()) {
|
||||
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
|
||||
coilBo.setCoilIds(allCoilIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
|
||||
List<WmsMaterialCoilVo> allCoils = materialCoilService.queryList(coilBo);
|
||||
coilVoMap = allCoils.stream()
|
||||
.collect(Collectors.toMap(WmsMaterialCoilVo::getCoilId, c -> c, (a, b) -> a));
|
||||
}
|
||||
|
||||
// 设置到每个订单的coilIds和coilList字段
|
||||
for (CrmOrderVo vo : records) {
|
||||
if (vo.getOrderId() != null && coilIdMap.containsKey(vo.getOrderId())) {
|
||||
List<Long> coilIdList = coilIdMap.get(vo.getOrderId());
|
||||
// 设置coilList(钢卷详细信息列表)
|
||||
List<WmsMaterialCoilVo> coilList = coilIdList.stream()
|
||||
.map(coilVoMap::get)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toList());
|
||||
vo.setCoilList(coilList);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
private QueryWrapper<CrmOrder> buildQueryWrapperPlus(CrmOrderBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
QueryWrapper<CrmOrder> qw = Wrappers.query();
|
||||
if (StringUtils.isNotBlank(bo.getKeyword())) {
|
||||
qw.and(w -> w.like("co.order_code", bo.getKeyword())
|
||||
.or().like("co.customer_id", bo.getKeyword())
|
||||
.or().like("co.salesman", bo.getKeyword())
|
||||
.or().like("co.audit_user", bo.getKeyword())
|
||||
.or().like("co.contract_code", bo.getKeyword())
|
||||
.or().like("co.annex_files", bo.getKeyword())
|
||||
.or().like("co.remark", bo.getKeyword())
|
||||
.or().like("co.contract_name", bo.getKeyword())
|
||||
.or().like("co.supplier", bo.getKeyword())
|
||||
.or().like("co.customer", bo.getKeyword()));
|
||||
}
|
||||
qw.eq(StringUtils.isNotBlank(bo.getOrderCode()), "co.order_code", bo.getOrderCode());
|
||||
qw.eq(bo.getOrderType() != null, "co.order_type", bo.getOrderType());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getCustomerId()), "co.customer_id", bo.getCustomerId());
|
||||
@@ -95,6 +181,33 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
|
||||
qw.eq(bo.getFinanceStatus() != null, "co.finance_status", bo.getFinanceStatus());
|
||||
qw.eq(bo.getUnpaidAmount() != null, "co.unpaid_amount", bo.getUnpaidAmount());
|
||||
qw.like(StringUtils.isNotBlank(bo.getContractCode()), "co.contract_code", bo.getContractCode());
|
||||
qw.like(StringUtils.isNotBlank(bo.getContractName()), "co.contract_name", bo.getContractName());
|
||||
qw.like(StringUtils.isNotBlank(bo.getSupplier()), "co.supplier", bo.getSupplier());
|
||||
qw.like(StringUtils.isNotBlank(bo.getCustomer()), "co.customer", bo.getCustomer());
|
||||
qw.eq(bo.getSignTime() != null, "co.sign_time", bo.getSignTime());
|
||||
qw.like(StringUtils.isNotBlank(bo.getSignLocation()), "co.sign_location", bo.getSignLocation());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getProductContent()), "co.product_content", bo.getProductContent());
|
||||
qw.eq(StringUtils.isNotBlank(bo.getContractContent()), "co.contract_content", bo.getContractContent());
|
||||
qw.like(StringUtils.isNotBlank(bo.getSupplierAddress()), "co.supplier_address", bo.getSupplierAddress());
|
||||
qw.like(StringUtils.isNotBlank(bo.getSupplierPhone()), "co.supplier_phone", bo.getSupplierPhone());
|
||||
qw.like(StringUtils.isNotBlank(bo.getSupplierBank()), "co.supplier_bank", bo.getSupplierBank());
|
||||
qw.like(StringUtils.isNotBlank(bo.getSupplierAccount()), "co.supplier_account", bo.getSupplierAccount());
|
||||
qw.like(StringUtils.isNotBlank(bo.getSupplierTaxNo()), "co.supplier_tax_no", bo.getSupplierTaxNo());
|
||||
qw.like(StringUtils.isNotBlank(bo.getCustomerAddress()), "co.customer_address", bo.getCustomerAddress());
|
||||
qw.like(StringUtils.isNotBlank(bo.getCustomerPhone()), "co.customer_phone", bo.getCustomerPhone());
|
||||
qw.like(StringUtils.isNotBlank(bo.getCustomerBank()), "co.customer_bank", bo.getCustomerBank());
|
||||
qw.like(StringUtils.isNotBlank(bo.getCustomerAccount()), "co.customer_account", bo.getCustomerAccount());
|
||||
qw.like(StringUtils.isNotBlank(bo.getCustomerTaxNo()), "co.customer_tax_no", bo.getCustomerTaxNo());
|
||||
qw.like(StringUtils.isNotBlank(bo.getTechAnnex()), "co.tech_annex", bo.getTechAnnex());
|
||||
qw.like(StringUtils.isNotBlank(bo.getBusinessAnnex()), "co.business_annex", bo.getBusinessAnnex());
|
||||
qw.like(StringUtils.isNotBlank(bo.getProductionSchedule()), "co.production_schedule", bo.getProductionSchedule());
|
||||
qw.like(StringUtils.isNotBlank(bo.getUnitPriceRemark()), "co.unit_price_remark", bo.getUnitPriceRemark());
|
||||
qw.eq(bo.getDepositPayable() != null, "co.deposit_payable", bo.getDepositPayable());
|
||||
qw.eq(bo.getDepositPaid() != null, "co.deposit_paid", bo.getDepositPaid());
|
||||
qw.eq(bo.getDepositRatio() != null, "co.deposit_ratio", bo.getDepositRatio());
|
||||
qw.eq(bo.getStatus() != null, "co.status", bo.getStatus());
|
||||
qw.eq(bo.getContractId() != null, "co.contract_id", bo.getContractId());
|
||||
qw.like(StringUtils.isNotBlank(bo.getAnnexFiles()), "co.annex_files", bo.getAnnexFiles());
|
||||
//逻辑删除
|
||||
qw.eq("co.del_flag", 0);
|
||||
//根据orderType排序预订单是0 正是订单是1 0排在前面 1排在后面 升序
|
||||
@@ -128,6 +241,33 @@ public class CrmOrderServiceImpl implements ICrmOrderService {
|
||||
lqw.eq(bo.getFinanceStatus() != null, CrmOrder::getFinanceStatus, bo.getFinanceStatus());
|
||||
lqw.eq(bo.getUnpaidAmount() != null, CrmOrder::getUnpaidAmount, bo.getUnpaidAmount());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getContractCode()), CrmOrder::getContractCode, bo.getContractCode());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getContractName()), CrmOrder::getContractName, bo.getContractName());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getSupplier()), CrmOrder::getSupplier, bo.getSupplier());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getCustomer()), CrmOrder::getCustomer, bo.getCustomer());
|
||||
lqw.eq(bo.getSignTime() != null, CrmOrder::getSignTime, bo.getSignTime());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getSignLocation()), CrmOrder::getSignLocation, bo.getSignLocation());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getProductContent()), CrmOrder::getProductContent, bo.getProductContent());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getContractContent()), CrmOrder::getContractContent, bo.getContractContent());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getSupplierAddress()), CrmOrder::getSupplierAddress, bo.getSupplierAddress());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getSupplierPhone()), CrmOrder::getSupplierPhone, bo.getSupplierPhone());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getSupplierBank()), CrmOrder::getSupplierBank, bo.getSupplierBank());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getSupplierAccount()), CrmOrder::getSupplierAccount, bo.getSupplierAccount());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getSupplierTaxNo()), CrmOrder::getSupplierTaxNo, bo.getSupplierTaxNo());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getCustomerAddress()), CrmOrder::getCustomerAddress, bo.getCustomerAddress());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getCustomerPhone()), CrmOrder::getCustomerPhone, bo.getCustomerPhone());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getCustomerBank()), CrmOrder::getCustomerBank, bo.getCustomerBank());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getCustomerAccount()), CrmOrder::getCustomerAccount, bo.getCustomerAccount());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getCustomerTaxNo()), CrmOrder::getCustomerTaxNo, bo.getCustomerTaxNo());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getTechAnnex()), CrmOrder::getTechAnnex, bo.getTechAnnex());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getBusinessAnnex()), CrmOrder::getBusinessAnnex, bo.getBusinessAnnex());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getProductionSchedule()), CrmOrder::getProductionSchedule, bo.getProductionSchedule());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getUnitPriceRemark()), CrmOrder::getUnitPriceRemark, bo.getUnitPriceRemark());
|
||||
lqw.eq(bo.getDepositPayable() != null, CrmOrder::getDepositPayable, bo.getDepositPayable());
|
||||
lqw.eq(bo.getDepositPaid() != null, CrmOrder::getDepositPaid, bo.getDepositPaid());
|
||||
lqw.eq(bo.getDepositRatio() != null, CrmOrder::getDepositRatio, bo.getDepositRatio());
|
||||
lqw.eq(bo.getStatus() != null, CrmOrder::getStatus, bo.getStatus());
|
||||
lqw.eq(bo.getContractId() != null, CrmOrder::getContractId, bo.getContractId());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getAnnexFiles()), CrmOrder::getAnnexFiles, bo.getAnnexFiles());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@ public class CrmSalesReportServiceImpl implements ICrmSalesReportService {
|
||||
List<CrmSalesReportVo.OrderDetail> orderDetails = baseMapper.selectOrderDetailList(bo);
|
||||
if (StringUtils.isNotNull(orderDetails) && !orderDetails.isEmpty()) {
|
||||
// 提取所有订单ID
|
||||
List<String> orderIds = orderDetails.stream()
|
||||
List<Long> orderIds = orderDetails.stream()
|
||||
.map(CrmSalesReportVo.OrderDetail::getOrderId)
|
||||
.filter(StringUtils::isNotNull)
|
||||
.distinct()
|
||||
@@ -70,7 +70,7 @@ public class CrmSalesReportServiceImpl implements ICrmSalesReportService {
|
||||
List<CrmOrderItem> orderItems = crmOrderItemMapper.selectOrderItemsByOrderIds(orderIds);
|
||||
|
||||
// 将明细按订单ID分组
|
||||
Map<String, List<CrmOrderItem>> orderItemMap = orderItems.stream()
|
||||
Map<Long, List<CrmOrderItem>> orderItemMap = orderItems.stream()
|
||||
.collect(Collectors.groupingBy(CrmOrderItem::getOrderId));
|
||||
|
||||
// 为每个订单设置对应的明细列表
|
||||
|
||||
42
klp-crm/src/main/resources/mapper/CrmContractMapper.xml
Normal file
42
klp-crm/src/main/resources/mapper/CrmContractMapper.xml
Normal file
@@ -0,0 +1,42 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.klp.crm.mapper.CrmContractMapper">
|
||||
|
||||
<resultMap type="com.klp.crm.domain.CrmContract" id="CrmContractResult">
|
||||
<result property="contractId" column="contract_id"/>
|
||||
<result property="contractName" column="contract_name"/>
|
||||
<result property="contractNo" column="contract_no"/>
|
||||
<result property="supplier" column="supplier"/>
|
||||
<result property="customer" column="customer"/>
|
||||
<result property="customerId" column="customer_id"/>
|
||||
<result property="deliveryDate" column="delivery_date"/>
|
||||
<result property="signTime" column="sign_time"/>
|
||||
<result property="signLocation" column="sign_location"/>
|
||||
<result property="productContent" column="product_content"/>
|
||||
<result property="contractContent" column="contract_content"/>
|
||||
<result property="supplierAddress" column="supplier_address"/>
|
||||
<result property="supplierPhone" column="supplier_phone"/>
|
||||
<result property="supplierBank" column="supplier_bank"/>
|
||||
<result property="supplierAccount" column="supplier_account"/>
|
||||
<result property="supplierTaxNo" column="supplier_tax_no"/>
|
||||
<result property="customerAddress" column="customer_address"/>
|
||||
<result property="customerPhone" column="customer_phone"/>
|
||||
<result property="customerBank" column="customer_bank"/>
|
||||
<result property="customerAccount" column="customer_account"/>
|
||||
<result property="customerTaxNo" column="customer_tax_no"/>
|
||||
<result property="techAnnex" column="tech_annex"/>
|
||||
<result property="businessAnnex" column="business_annex"/>
|
||||
<result property="productionSchedule" column="production_schedule"/>
|
||||
<result property="status" column="status"/>
|
||||
<result property="remark" column="remark"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
<result property="delFlag" column="del_flag"/>
|
||||
</resultMap>
|
||||
|
||||
|
||||
</mapper>
|
||||
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.klp.crm.mapper.CrmContractProductMapper">
|
||||
|
||||
<resultMap type="com.klp.crm.domain.CrmContractProduct" id="CrmContractProductResult">
|
||||
<result property="contractProductId" column="contract_product_id"/>
|
||||
<result property="contractId" column="contract_id"/>
|
||||
<result property="productName" column="product_name"/>
|
||||
<result property="specMin" column="spec_min"/>
|
||||
<result property="specMax" column="spec_max"/>
|
||||
<result property="material" column="material"/>
|
||||
<result property="quantity" column="quantity"/>
|
||||
<result property="taxInclusiveUnitPrice" column="tax_inclusive_unit_price"/>
|
||||
<result property="exTaxUnitPrice" column="ex_tax_unit_price"/>
|
||||
<result property="taxInclusiveAmount" column="tax_inclusive_amount"/>
|
||||
<result property="delFlag" column="del_flag"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
<result property="remark" column="remark"/>
|
||||
</resultMap>
|
||||
|
||||
|
||||
</mapper>
|
||||
@@ -14,6 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="customerLevel" column="customer_level"/>
|
||||
<result property="address" column="address"/>
|
||||
<result property="bankInfo" column="bank_info"/>
|
||||
<result property="taxNumber" column="tax_number"/>
|
||||
<result property="remark" column="remark"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
|
||||
@@ -17,10 +17,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="material" column="material"/>
|
||||
<result property="grade" column="grade"/>
|
||||
<result property="weight" column="weight"/>
|
||||
<result property="widthTolerance" column="width_tolerance"/>
|
||||
<result property="thicknessTolerance" column="thickness_tolerance"/>
|
||||
<result property="contractPrice" column="contract_price"/>
|
||||
<result property="customizer" column="customizer"/>
|
||||
<result property="shipper" column="shipper"/>
|
||||
<result property="productionBatch" column="production_batch"/>
|
||||
<result property="surfaceTreatment" column="surface_treatment"/>
|
||||
<result property="edgeCuttingReq" column="edge_cutting_req"/>
|
||||
<result property="packagingReq" column="packaging_req"/>
|
||||
<result property="width" column="width"/>
|
||||
<result property="thickness" column="thickness"/>
|
||||
<result property="purpose" column="purpose"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
@@ -42,10 +50,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
material,
|
||||
grade,
|
||||
weight,
|
||||
width_tolerance,
|
||||
thickness_tolerance,
|
||||
contract_price,
|
||||
customizer,
|
||||
shipper,
|
||||
production_batch,
|
||||
surface_treatment,
|
||||
edge_cutting_req,
|
||||
packaging_req,
|
||||
width,
|
||||
thickness,
|
||||
purpose,
|
||||
create_by,
|
||||
create_time,
|
||||
update_by,
|
||||
|
||||
@@ -20,6 +20,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
<result property="unpaidAmount" column="unpaid_amount"/>
|
||||
<result property="remark" column="remark"/>
|
||||
<result property="contractCode" column="contract_code"/>
|
||||
<result property="contractName" column="contract_name"/>
|
||||
<result property="supplier" column="supplier"/>
|
||||
<result property="customer" column="customer"/>
|
||||
<result property="signTime" column="sign_time"/>
|
||||
<result property="signLocation" column="sign_location"/>
|
||||
<result property="productContent" column="product_content"/>
|
||||
<result property="contractContent" column="contract_content"/>
|
||||
<result property="supplierAddress" column="supplier_address"/>
|
||||
<result property="supplierPhone" column="supplier_phone"/>
|
||||
<result property="supplierBank" column="supplier_bank"/>
|
||||
<result property="supplierAccount" column="supplier_account"/>
|
||||
<result property="supplierTaxNo" column="supplier_tax_no"/>
|
||||
<result property="customerAddress" column="customer_address"/>
|
||||
<result property="customerPhone" column="customer_phone"/>
|
||||
<result property="customerBank" column="customer_bank"/>
|
||||
<result property="customerAccount" column="customer_account"/>
|
||||
<result property="customerTaxNo" column="customer_tax_no"/>
|
||||
<result property="techAnnex" column="tech_annex"/>
|
||||
<result property="businessAnnex" column="business_annex"/>
|
||||
<result property="productionSchedule" column="production_schedule"/>
|
||||
<result property="unitPriceRemark" column="unit_price_remark"/>
|
||||
<result property="depositPayable" column="deposit_payable"/>
|
||||
<result property="depositPaid" column="deposit_paid"/>
|
||||
<result property="depositRatio" column="deposit_ratio"/>
|
||||
<result property="status" column="status"/>
|
||||
<result property="contractId" column="contract_id"/>
|
||||
<result property="annexFiles" column="annex_files"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
@@ -43,6 +70,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
co.unpaid_amount AS unpaidAmount,
|
||||
co.remark,
|
||||
co.contract_code AS contractCode,
|
||||
co.contract_name AS contractName,
|
||||
co.supplier,
|
||||
co.customer,
|
||||
co.sign_time AS signTime,
|
||||
co.sign_location AS signLocation,
|
||||
co.product_content AS productContent,
|
||||
co.contract_content AS contractContent,
|
||||
co.supplier_address AS supplierAddress,
|
||||
co.supplier_phone AS supplierPhone,
|
||||
co.supplier_bank AS supplierBank,
|
||||
co.supplier_account AS supplierAccount,
|
||||
co.supplier_tax_no AS supplierTaxNo,
|
||||
co.customer_address AS customerAddress,
|
||||
co.customer_phone AS customerPhone,
|
||||
co.customer_bank AS customerBank,
|
||||
co.customer_account AS customerAccount,
|
||||
co.customer_tax_no AS customerTaxNo,
|
||||
co.tech_annex AS techAnnex,
|
||||
co.business_annex AS businessAnnex,
|
||||
co.production_schedule AS productionSchedule,
|
||||
co.unit_price_remark AS unitPriceRemark,
|
||||
co.deposit_payable AS depositPayable,
|
||||
co.deposit_paid AS depositPaid,
|
||||
co.deposit_ratio AS depositRatio,
|
||||
co.status,
|
||||
co.contract_id AS contractId,
|
||||
co.annex_files AS annexFiles,
|
||||
co.create_by AS createBy,
|
||||
co.create_time AS createTime,
|
||||
co.update_by AS updateBy,
|
||||
@@ -75,6 +129,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
co.unpaid_amount AS unpaidAmount,
|
||||
co.remark,
|
||||
co.contract_code AS contractCode,
|
||||
co.contract_name AS contractName,
|
||||
co.supplier,
|
||||
co.customer,
|
||||
co.sign_time AS signTime,
|
||||
co.sign_location AS signLocation,
|
||||
co.product_content AS productContent,
|
||||
co.contract_content AS contractContent,
|
||||
co.supplier_address AS supplierAddress,
|
||||
co.supplier_phone AS supplierPhone,
|
||||
co.supplier_bank AS supplierBank,
|
||||
co.supplier_account AS supplierAccount,
|
||||
co.supplier_tax_no AS supplierTaxNo,
|
||||
co.customer_address AS customerAddress,
|
||||
co.customer_phone AS customerPhone,
|
||||
co.customer_bank AS customerBank,
|
||||
co.customer_account AS customerAccount,
|
||||
co.customer_tax_no AS customerTaxNo,
|
||||
co.tech_annex AS techAnnex,
|
||||
co.business_annex AS businessAnnex,
|
||||
co.production_schedule AS productionSchedule,
|
||||
co.unit_price_remark AS unitPriceRemark,
|
||||
co.deposit_payable AS depositPayable,
|
||||
co.deposit_paid AS depositPaid,
|
||||
co.deposit_ratio AS depositRatio,
|
||||
co.status,
|
||||
co.contract_id AS contractId,
|
||||
co.annex_files AS annexFiles,
|
||||
co.create_by AS createBy,
|
||||
co.create_time AS createTime,
|
||||
co.update_by AS updateBy,
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
package com.klp.ems.controller;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Arrays;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import javax.validation.constraints.*;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import com.klp.common.annotation.RepeatSubmit;
|
||||
import com.klp.common.annotation.Log;
|
||||
import com.klp.common.core.controller.BaseController;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.klp.common.core.domain.R;
|
||||
import com.klp.common.core.validate.AddGroup;
|
||||
import com.klp.common.core.validate.EditGroup;
|
||||
import com.klp.common.enums.BusinessType;
|
||||
import com.klp.common.utils.poi.ExcelUtil;
|
||||
import com.klp.ems.domain.vo.EmsEnergyRecordVo;
|
||||
import com.klp.ems.domain.bo.EmsEnergyRecordBo;
|
||||
import com.klp.ems.service.IEmsEnergyRecordService;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 能源消耗记录
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@RestController
|
||||
@RequestMapping("/ems/energyRecord")
|
||||
public class EmsEnergyRecordController extends BaseController {
|
||||
|
||||
private final IEmsEnergyRecordService iEmsEnergyRecordService;
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录列表
|
||||
*/
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<EmsEnergyRecordVo> list(EmsEnergyRecordBo bo, PageQuery pageQuery) {
|
||||
return iEmsEnergyRecordService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* 导出能源消耗记录列表
|
||||
*/
|
||||
@Log(title = "能源消耗记录", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(EmsEnergyRecordBo bo, HttpServletResponse response) {
|
||||
List<EmsEnergyRecordVo> list = iEmsEnergyRecordService.queryList(bo);
|
||||
ExcelUtil.exportExcel(list, "能源消耗记录", EmsEnergyRecordVo.class, response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取能源消耗记录详细信息
|
||||
*
|
||||
* @param energyRecordId 主键
|
||||
*/
|
||||
@GetMapping("/{energyRecordId}")
|
||||
public R<EmsEnergyRecordVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable Long energyRecordId) {
|
||||
return R.ok(iEmsEnergyRecordService.queryById(energyRecordId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增能源消耗记录
|
||||
*/
|
||||
@Log(title = "能源消耗记录", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
public R<Long> add(@Validated(AddGroup.class) @RequestBody EmsEnergyRecordBo bo) {
|
||||
return R.ok(iEmsEnergyRecordService.insertByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改能源消耗记录
|
||||
*/
|
||||
@Log(title = "能源消耗记录", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
public R<Void> edit(@Validated(EditGroup.class) @RequestBody EmsEnergyRecordBo bo) {
|
||||
return toAjax(iEmsEnergyRecordService.updateByBo(bo));
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除能源消耗记录
|
||||
*
|
||||
* @param energyRecordIds 主键串
|
||||
*/
|
||||
@Log(title = "能源消耗记录", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{energyRecordIds}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
@PathVariable Long[] energyRecordIds) {
|
||||
return toAjax(iEmsEnergyRecordService.deleteWithValidByIds(Arrays.asList(energyRecordIds), true));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.klp.ems.domain;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
||||
/**
|
||||
* 能源消耗记录对象 ems_energy_record
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("ems_energy_record")
|
||||
public class EmsEnergyRecord extends BaseEntity {
|
||||
|
||||
private static final long serialVersionUID=1L;
|
||||
|
||||
/**
|
||||
* 能耗记录主键ID
|
||||
*/
|
||||
@TableId(value = "energy_record_id")
|
||||
private Long energyRecordId;
|
||||
/**
|
||||
* 表计ID(关联计量设备表)
|
||||
*/
|
||||
private Long meterId;
|
||||
/**
|
||||
* 能源ID(关联能源类型表:电/水/气/暖等)
|
||||
*/
|
||||
private Long energyId;
|
||||
/**
|
||||
* 消耗量
|
||||
*/
|
||||
private BigDecimal consumption;
|
||||
/**
|
||||
* 统计日期(yyyy-MM-dd)
|
||||
*/
|
||||
private Date recordDate;
|
||||
/**
|
||||
* 记录人ID
|
||||
*/
|
||||
private Long recordedBy;
|
||||
/**
|
||||
* 删除标志(0=存在 2=删除)
|
||||
*/
|
||||
@TableLogic
|
||||
private String delFlag;
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
package com.klp.ems.domain.bo;
|
||||
|
||||
import com.klp.common.core.domain.BaseEntity;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import javax.validation.constraints.*;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
/**
|
||||
* 能源消耗记录业务对象 ems_energy_record
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
public class EmsEnergyRecordBo extends BaseEntity {
|
||||
|
||||
/**
|
||||
* 能耗记录主键ID
|
||||
*/
|
||||
private Long energyRecordId;
|
||||
|
||||
/**
|
||||
* 表计ID(关联计量设备表)
|
||||
*/
|
||||
private Long meterId;
|
||||
|
||||
/**
|
||||
* 能源ID(关联能源类型表:电/水/气/暖等)
|
||||
*/
|
||||
private Long energyId;
|
||||
|
||||
/**
|
||||
* 消耗量
|
||||
*/
|
||||
private BigDecimal consumption;
|
||||
|
||||
/**
|
||||
* 统计日期(yyyy-MM-dd)
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private Date recordDate;
|
||||
|
||||
/**
|
||||
* 统计日期开始时间(yyyy-MM-dd,不含时分秒)
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private Date recordStartDate;
|
||||
|
||||
/**
|
||||
* 统计日期结束时间(yyyy-MM-dd,不含时分秒)
|
||||
*/
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private Date recordEndDate;
|
||||
/**
|
||||
* 记录人ID
|
||||
*/
|
||||
private Long recordedBy;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 表计编号(模糊查询)
|
||||
*/
|
||||
private String meterCode;
|
||||
|
||||
/**
|
||||
* 能源名称(模糊查询)
|
||||
*/
|
||||
private String energyName;
|
||||
|
||||
/**
|
||||
* 设备型号(模糊查询)
|
||||
*/
|
||||
private String model;
|
||||
|
||||
/**
|
||||
* 制造商(模糊查询)
|
||||
*/
|
||||
private String manufacturer;
|
||||
|
||||
/**
|
||||
* 设备状态:0=在用,1=停用,2=维护
|
||||
*/
|
||||
private Integer meterStatus;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
package com.klp.ems.domain.vo;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import com.klp.common.annotation.ExcelDictFormat;
|
||||
import com.klp.common.convert.ExcelDictConvert;
|
||||
import lombok.Data;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
|
||||
/**
|
||||
* 能源消耗记录视图对象 ems_energy_record
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
public class EmsEnergyRecordVo {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 能耗记录主键ID
|
||||
*/
|
||||
@ExcelProperty(value = "能耗记录主键ID")
|
||||
private Long energyRecordId;
|
||||
|
||||
/**
|
||||
* 表计ID(关联计量设备表)
|
||||
*/
|
||||
@ExcelProperty(value = "表计ID", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "关=联计量设备表")
|
||||
private Long meterId;
|
||||
|
||||
/**
|
||||
* 能源ID(关联能源类型表:电/水/气/暖等)
|
||||
*/
|
||||
@ExcelProperty(value = "能源ID", converter = ExcelDictConvert.class)
|
||||
@ExcelDictFormat(readConverterExp = "关=联能源类型表:电/水/气/暖等")
|
||||
private Long energyId;
|
||||
|
||||
/**
|
||||
* 消耗量
|
||||
*/
|
||||
@ExcelProperty(value = "消耗量")
|
||||
private BigDecimal consumption;
|
||||
|
||||
/**
|
||||
* 统计日期(yyyy-MM-dd)
|
||||
*/
|
||||
@ExcelProperty(value = "统计日期", converter = ExcelDictConvert.class)
|
||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private Date recordDate;
|
||||
|
||||
/**
|
||||
* 记录人ID
|
||||
*/
|
||||
@ExcelProperty(value = "记录人ID")
|
||||
private Long recordedBy;
|
||||
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
@ExcelProperty(value = "备注")
|
||||
private String remark;
|
||||
|
||||
/**
|
||||
* 表计编号
|
||||
*/
|
||||
private String meterCode;
|
||||
|
||||
/**
|
||||
* 设备型号
|
||||
*/
|
||||
private String meterModel;
|
||||
|
||||
/**
|
||||
* 制造商
|
||||
*/
|
||||
private String meterManufacturer;
|
||||
|
||||
/**
|
||||
* 设备状态:0=在用,1=停用,2=维护
|
||||
*/
|
||||
private Integer meterStatus;
|
||||
|
||||
|
||||
/**
|
||||
* 能源名称
|
||||
*/
|
||||
private String energyName;
|
||||
|
||||
|
||||
/**
|
||||
* 能源单位
|
||||
*/
|
||||
private String energyUnit;
|
||||
|
||||
/**
|
||||
* 能源编号
|
||||
*/
|
||||
private String energyCode;
|
||||
|
||||
/**
|
||||
* 能源描述
|
||||
*/
|
||||
private String energyDescription;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package com.klp.ems.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.klp.ems.domain.EmsEnergyRecord;
|
||||
import com.klp.ems.domain.vo.EmsEnergyRecordVo;
|
||||
import com.klp.common.core.mapper.BaseMapperPlus;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
/**
|
||||
* 能源消耗记录Mapper接口
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
public interface EmsEnergyRecordMapper extends BaseMapperPlus<EmsEnergyRecordMapper, EmsEnergyRecord, EmsEnergyRecordVo> {
|
||||
|
||||
Page<EmsEnergyRecordVo> selectVoPagePlus(Page<Object> build,@Param("ew") QueryWrapper<EmsEnergyRecord> qw);
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
package com.klp.ems.service;
|
||||
|
||||
import com.klp.ems.domain.EmsEnergyRecord;
|
||||
import com.klp.ems.domain.vo.EmsEnergyRecordVo;
|
||||
import com.klp.ems.domain.bo.EmsEnergyRecordBo;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 能源消耗记录Service接口
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
public interface IEmsEnergyRecordService {
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录
|
||||
*/
|
||||
EmsEnergyRecordVo queryById(Long energyRecordId);
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录列表
|
||||
*/
|
||||
TableDataInfo<EmsEnergyRecordVo> queryPageList(EmsEnergyRecordBo bo, PageQuery pageQuery);
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录列表
|
||||
*/
|
||||
List<EmsEnergyRecordVo> queryList(EmsEnergyRecordBo bo);
|
||||
|
||||
/**
|
||||
* 新增能源消耗记录
|
||||
*/
|
||||
Long insertByBo(EmsEnergyRecordBo bo);
|
||||
|
||||
/**
|
||||
* 修改能源消耗记录
|
||||
*/
|
||||
Boolean updateByBo(EmsEnergyRecordBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除能源消耗记录信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
}
|
||||
@@ -0,0 +1,139 @@
|
||||
package com.klp.ems.service.impl;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.klp.common.core.page.TableDataInfo;
|
||||
import com.klp.common.core.domain.PageQuery;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.klp.common.utils.StringUtils;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.klp.ems.domain.bo.EmsEnergyRecordBo;
|
||||
import com.klp.ems.domain.vo.EmsEnergyRecordVo;
|
||||
import com.klp.ems.domain.EmsEnergyRecord;
|
||||
import com.klp.ems.mapper.EmsEnergyRecordMapper;
|
||||
import com.klp.ems.service.IEmsEnergyRecordService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 能源消耗记录Service业务层处理
|
||||
*
|
||||
* @author klp
|
||||
* @date 2026-04-20
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
public class EmsEnergyRecordServiceImpl implements IEmsEnergyRecordService {
|
||||
|
||||
private final EmsEnergyRecordMapper baseMapper;
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录
|
||||
*/
|
||||
@Override
|
||||
public EmsEnergyRecordVo queryById(Long energyRecordId){
|
||||
return baseMapper.selectVoById(energyRecordId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录列表
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<EmsEnergyRecordVo> queryPageList(EmsEnergyRecordBo bo, PageQuery pageQuery) {
|
||||
QueryWrapper<EmsEnergyRecord> qw = buildQueryWrapperPlus(bo);
|
||||
Page<EmsEnergyRecordVo> result = baseMapper.selectVoPagePlus(pageQuery.build(), qw);
|
||||
return TableDataInfo.build(result);
|
||||
}
|
||||
|
||||
private QueryWrapper<EmsEnergyRecord> buildQueryWrapperPlus(EmsEnergyRecordBo bo) {
|
||||
QueryWrapper<EmsEnergyRecord> qw = Wrappers.query();
|
||||
|
||||
// 主表字段查询(使用别名 er)
|
||||
qw.eq(bo.getMeterId() != null, "er.meter_id", bo.getMeterId());
|
||||
qw.eq(bo.getEnergyId() != null, "er.energy_id", bo.getEnergyId());
|
||||
qw.eq(bo.getConsumption() != null, "er.consumption", bo.getConsumption());
|
||||
qw.eq(bo.getRecordDate() != null, "er.record_date", bo.getRecordDate());
|
||||
qw.eq(bo.getRecordedBy() != null, "er.recorded_by", bo.getRecordedBy());
|
||||
|
||||
// 时间段筛选:recordStartDate <= recordDate <= recordEndDate
|
||||
qw.ge(bo.getRecordStartDate() != null, "er.record_date", bo.getRecordStartDate());
|
||||
qw.le(bo.getRecordEndDate() != null, "er.record_date", bo.getRecordEndDate());
|
||||
// 逻辑删除
|
||||
qw.eq("er.del_flag", "0");
|
||||
// 默认排序:按统计日期倒序
|
||||
qw.orderByDesc("er.record_date");
|
||||
|
||||
return qw;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询能源消耗记录列表
|
||||
*/
|
||||
@Override
|
||||
public List<EmsEnergyRecordVo> queryList(EmsEnergyRecordBo bo) {
|
||||
LambdaQueryWrapper<EmsEnergyRecord> lqw = buildQueryWrapper(bo);
|
||||
return baseMapper.selectVoList(lqw);
|
||||
}
|
||||
|
||||
private LambdaQueryWrapper<EmsEnergyRecord> buildQueryWrapper(EmsEnergyRecordBo bo) {
|
||||
Map<String, Object> params = bo.getParams();
|
||||
LambdaQueryWrapper<EmsEnergyRecord> lqw = Wrappers.lambdaQuery();
|
||||
lqw.eq(bo.getMeterId() != null, EmsEnergyRecord::getMeterId, bo.getMeterId());
|
||||
lqw.eq(bo.getEnergyId() != null, EmsEnergyRecord::getEnergyId, bo.getEnergyId());
|
||||
lqw.eq(bo.getConsumption() != null, EmsEnergyRecord::getConsumption, bo.getConsumption());
|
||||
lqw.eq(bo.getRecordDate() != null, EmsEnergyRecord::getRecordDate, bo.getRecordDate());
|
||||
// 时间段筛选:recordDateStart <= recordDate <= recordDateEnd
|
||||
lqw.ge(bo.getRecordStartDate() != null, EmsEnergyRecord::getRecordDate, bo.getRecordStartDate());
|
||||
lqw.le(bo.getRecordEndDate() != null, EmsEnergyRecord::getRecordDate, bo.getRecordEndDate());
|
||||
lqw.eq(bo.getRecordedBy() != null, EmsEnergyRecord::getRecordedBy, bo.getRecordedBy());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增能源消耗记录
|
||||
*/
|
||||
@Override
|
||||
public Long insertByBo(EmsEnergyRecordBo bo) {
|
||||
EmsEnergyRecord add = BeanUtil.toBean(bo, EmsEnergyRecord.class);
|
||||
validEntityBeforeSave(add);
|
||||
boolean flag = baseMapper.insert(add) > 0;
|
||||
if (flag) {
|
||||
bo.setEnergyRecordId(add.getEnergyRecordId());
|
||||
}
|
||||
return add.getEnergyRecordId();
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改能源消耗记录
|
||||
*/
|
||||
@Override
|
||||
public Boolean updateByBo(EmsEnergyRecordBo bo) {
|
||||
EmsEnergyRecord update = BeanUtil.toBean(bo, EmsEnergyRecord.class);
|
||||
validEntityBeforeSave(update);
|
||||
return baseMapper.updateById(update) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(EmsEnergyRecord entity){
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除能源消耗记录
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
}
|
||||
45
klp-ems/src/main/resources/mapper/EmsEnergyRecordMapper.xml
Normal file
45
klp-ems/src/main/resources/mapper/EmsEnergyRecordMapper.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<!DOCTYPE mapper
|
||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="com.klp.ems.mapper.EmsEnergyRecordMapper">
|
||||
|
||||
<resultMap type="com.klp.ems.domain.EmsEnergyRecord" id="EmsEnergyRecordResult">
|
||||
<result property="energyRecordId" column="energy_record_id"/>
|
||||
<result property="meterId" column="meter_id"/>
|
||||
<result property="energyId" column="energy_id"/>
|
||||
<result property="consumption" column="consumption"/>
|
||||
<result property="recordDate" column="record_date"/>
|
||||
<result property="recordedBy" column="recorded_by"/>
|
||||
<result property="createBy" column="create_by"/>
|
||||
<result property="updateBy" column="update_by"/>
|
||||
<result property="createTime" column="create_time"/>
|
||||
<result property="updateTime" column="update_time"/>
|
||||
<result property="delFlag" column="del_flag"/>
|
||||
<result property="remark" column="remark"/>
|
||||
</resultMap>
|
||||
<select id="selectVoPagePlus" resultType="com.klp.ems.domain.vo.EmsEnergyRecordVo">
|
||||
SELECT
|
||||
er.energy_record_id,
|
||||
er.meter_id,
|
||||
er.energy_id,
|
||||
er.consumption,
|
||||
er.record_date,
|
||||
er.recorded_by,
|
||||
er.remark,
|
||||
m.meter_code AS meterCode,
|
||||
m.model AS meterModel,
|
||||
m.manufacturer AS meterManufacturer,
|
||||
m.status AS meterStatus,
|
||||
et.name AS energyName,
|
||||
et.unit AS energyUnit,
|
||||
et.code AS energyCode,
|
||||
et.description AS energyDescription
|
||||
FROM ems_energy_record er
|
||||
LEFT JOIN ems_meter m ON er.meter_id = m.meter_id AND m.del_flag = '0'
|
||||
LEFT JOIN ems_energy_type et ON er.energy_id = et.energy_type_id AND et.del_flag = '0'
|
||||
${ew.customSqlSegment}
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
@@ -40,6 +40,9 @@
|
||||
"@babel/parser": "7.7.4",
|
||||
"@jiaminghi/data-view": "^2.10.0",
|
||||
"@riophae/vue-treeselect": "0.4.0",
|
||||
"@vue-office/docx": "^1.6.3",
|
||||
"@vue-office/excel": "^1.7.14",
|
||||
"@vue/composition-api": "^1.7.2",
|
||||
"axios": "0.24.0",
|
||||
"bpmn-js-token-simulation": "0.10.0",
|
||||
"clipboard": "2.0.8",
|
||||
@@ -74,12 +77,15 @@
|
||||
"vue": "2.6.12",
|
||||
"vue-count-to": "1.0.13",
|
||||
"vue-cropper": "0.5.5",
|
||||
"vue-demi": "^0.14.10",
|
||||
"vue-flv-player": "^1.0.3",
|
||||
"vue-konva": "^2.1.7",
|
||||
"vue-meta": "2.4.0",
|
||||
"vue-router": "3.4.9",
|
||||
"vuedraggable": "2.24.3",
|
||||
"vuex": "3.6.0",
|
||||
"vxe-table": "^2.11.0",
|
||||
"xe-utils": "^3.5.31",
|
||||
"xlsx": "^0.18.5",
|
||||
"xml-js": "1.6.11"
|
||||
},
|
||||
|
||||
62
klp-ui/src/api/crm/contract.js
Normal file
62
klp-ui/src/api/crm/contract.js
Normal file
@@ -0,0 +1,62 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询合同信息列表
|
||||
export function listContract(query) {
|
||||
return request({
|
||||
url: '/crm/contract/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询合同信息详细
|
||||
export function getContract(contractId) {
|
||||
return request({
|
||||
url: '/crm/contract/' + contractId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增合同信息
|
||||
export function addContract(data) {
|
||||
return request({
|
||||
url: '/crm/contract',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改合同信息
|
||||
export function updateContract(data) {
|
||||
return request({
|
||||
url: '/crm/contract',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除合同信息
|
||||
export function delContract(contractId) {
|
||||
return request({
|
||||
url: '/crm/contract/' + contractId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询合同下的所有订单异议和收款记录
|
||||
export function listContractOrderObjection(contractId) {
|
||||
return request({
|
||||
url: '/crm/orderItem/contractFinance/' + contractId,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询该合同下的配卷情况
|
||||
*/
|
||||
export function listContractPackaging(contractId) {
|
||||
return request({
|
||||
url: '/crm/orderItem/coils/contract/' + contractId,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
44
klp-ui/src/api/crm/contractProduct.js
Normal file
44
klp-ui/src/api/crm/contractProduct.js
Normal file
@@ -0,0 +1,44 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询合同产品明细列表
|
||||
export function listContractProduct(query) {
|
||||
return request({
|
||||
url: '/crm/contractProduct/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询合同产品明细详细
|
||||
export function getContractProduct(contractProductId) {
|
||||
return request({
|
||||
url: '/crm/contractProduct/' + contractProductId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增合同产品明细
|
||||
export function addContractProduct(data) {
|
||||
return request({
|
||||
url: '/crm/contractProduct',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改合同产品明细
|
||||
export function updateContractProduct(data) {
|
||||
return request({
|
||||
url: '/crm/contractProduct',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除合同产品明细
|
||||
export function delContractProduct(contractProductId) {
|
||||
return request({
|
||||
url: '/crm/contractProduct/' + contractProductId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
@@ -42,3 +42,19 @@ export function delCustomer(customerId) {
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询该客户相关的配卷情况
|
||||
export function listCoilByCustomerId(customerId) {
|
||||
return request({
|
||||
url: '/crm/orderItem/coils/customer/' + customerId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 查询该项目相关的订单异议和财务信息
|
||||
export function listFinanceByCustomerId(customerId) {
|
||||
return request({
|
||||
url: '/crm/orderItem/customerFinance/' + customerId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
@@ -42,3 +42,24 @@ export function delOrder(orderId) {
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询该订单下的所有配卷
|
||||
*/
|
||||
export function listOrderPackaging(orderId) {
|
||||
return request({
|
||||
url: `/crm/orderItem/coils/order/${orderId}`,
|
||||
method: 'get',
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询今日订单
|
||||
*/
|
||||
export function listTodayOrder(query) {
|
||||
return request({
|
||||
url: '/crm/order/daily',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
44
klp-ui/src/api/ems/energyRecord.js
Normal file
44
klp-ui/src/api/ems/energyRecord.js
Normal file
@@ -0,0 +1,44 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询能源消耗记录列表
|
||||
export function listEnergyRecord(query) {
|
||||
return request({
|
||||
url: '/ems/energyRecord/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询能源消耗记录详细
|
||||
export function getEnergyRecord(energyRecordId) {
|
||||
return request({
|
||||
url: '/ems/energyRecord/' + energyRecordId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增能源消耗记录
|
||||
export function addEnergyRecord(data) {
|
||||
return request({
|
||||
url: '/ems/energyRecord',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改能源消耗记录
|
||||
export function updateEnergyRecord(data) {
|
||||
return request({
|
||||
url: '/ems/energyRecord',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除能源消耗记录
|
||||
export function delEnergyRecord(energyRecordId) {
|
||||
return request({
|
||||
url: '/ems/energyRecord/' + energyRecordId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
44
klp-ui/src/api/wms/annealOperateEvent.js
Normal file
44
klp-ui/src/api/wms/annealOperateEvent.js
Normal file
@@ -0,0 +1,44 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询退火操作事件列表
|
||||
export function listAnnealOperateEvent(query) {
|
||||
return request({
|
||||
url: '/wms/annealOperateEvent/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询退火操作事件详细
|
||||
export function getAnnealOperateEvent(eventId) {
|
||||
return request({
|
||||
url: '/wms/annealOperateEvent/' + eventId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增退火操作事件
|
||||
export function addAnnealOperateEvent(data) {
|
||||
return request({
|
||||
url: '/wms/annealOperateEvent',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改退火操作事件
|
||||
export function updateAnnealOperateEvent(data) {
|
||||
return request({
|
||||
url: '/wms/annealOperateEvent',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除退火操作事件
|
||||
export function delAnnealOperateEvent(eventId) {
|
||||
return request({
|
||||
url: '/wms/annealOperateEvent/' + eventId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
56
klp-ui/src/api/wms/attendance.js
Normal file
56
klp-ui/src/api/wms/attendance.js
Normal file
@@ -0,0 +1,56 @@
|
||||
import request from '@/utils/request'
|
||||
import attendanceRequest from '@/utils/attendanceRequest'
|
||||
|
||||
// 查询考勤记录列表
|
||||
export function listRecords(query) {
|
||||
return request({
|
||||
url: '/wms/attendanceRecords/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询考勤记录详细
|
||||
export function getRecords(id) {
|
||||
return request({
|
||||
url: '/wms/attendanceRecords/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增考勤记录
|
||||
export function addRecords(data) {
|
||||
return request({
|
||||
url: '/wms/attendanceRecords',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改考勤记录
|
||||
export function updateRecords(data) {
|
||||
return request({
|
||||
url: '/wms/attendanceRecords',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除考勤记录
|
||||
export function delRecords(id) {
|
||||
return request({
|
||||
url: '/wms/attendanceRecords/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 同步考勤记录
|
||||
export function syncRecords(starttime) {
|
||||
return attendanceRequest({
|
||||
url: '/sync_attendance',
|
||||
method: 'post',
|
||||
data: {
|
||||
starttime
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -378,4 +378,49 @@ export function listWithBindInfoCoil(params) {
|
||||
params,
|
||||
timeout: 600000
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 类型不匹配的卷
|
||||
*/
|
||||
export function listTypeErrorCoil() {
|
||||
return request({
|
||||
url: '/wms/materialCoil/queryMismatchedItemCoils',
|
||||
method: 'get',
|
||||
timeout: 600000
|
||||
})
|
||||
}
|
||||
|
||||
export function getCoilStatisticsList(params) {
|
||||
return request({
|
||||
url: '/wms/materialCoil/statisticsList',
|
||||
method: 'get',
|
||||
params,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询原料材质与钢卷类型不匹配的钢卷
|
||||
*/
|
||||
export function listMismatchedItemCoil(params) {
|
||||
return request({
|
||||
url: '/wms/materialCoil/queryMaterialMismatchCoils',
|
||||
method: 'get',
|
||||
timeout: 600000,
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* 修复原料材质与钢卷类型不匹配的钢卷
|
||||
*/
|
||||
export function fixMismatchedItemCoil(coilId) {
|
||||
return request({
|
||||
url: '/wms/materialCoil/fixMaterialMismatch',
|
||||
method: 'put',
|
||||
timeout: 600000,
|
||||
params: {
|
||||
coilId
|
||||
}
|
||||
})
|
||||
}
|
||||
44
klp-ui/src/api/wms/coilContractRel.js
Normal file
44
klp-ui/src/api/wms/coilContractRel.js
Normal file
@@ -0,0 +1,44 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询钢卷与合同关联关系列表
|
||||
export function listCoilContractRel(query) {
|
||||
return request({
|
||||
url: '/wms/coilContractRel/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询钢卷与合同关联关系详细
|
||||
export function getCoilContractRel(relId) {
|
||||
return request({
|
||||
url: '/wms/coilContractRel/' + relId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增钢卷与合同关联关系
|
||||
export function addCoilContractRel(data) {
|
||||
return request({
|
||||
url: '/wms/coilContractRel',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改钢卷与合同关联关系
|
||||
export function updateCoilContractRel(data) {
|
||||
return request({
|
||||
url: '/wms/coilContractRel',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除钢卷与合同关联关系
|
||||
export function delCoilContractRel(relId) {
|
||||
return request({
|
||||
url: '/wms/coilContractRel/' + relId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
44
klp-ui/src/api/wms/coilQualityRejudge.js
Normal file
44
klp-ui/src/api/wms/coilQualityRejudge.js
Normal file
@@ -0,0 +1,44 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询钢卷质量改判记录列表
|
||||
export function listCoilQualityRejudge(query) {
|
||||
return request({
|
||||
url: '/wms/coilQualityRejudge/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询钢卷质量改判记录详细
|
||||
export function getCoilQualityRejudge(rejudgeId) {
|
||||
return request({
|
||||
url: '/wms/coilQualityRejudge/' + rejudgeId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增钢卷质量改判记录
|
||||
export function addCoilQualityRejudge(data) {
|
||||
return request({
|
||||
url: '/wms/coilQualityRejudge',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改钢卷质量改判记录
|
||||
export function updateCoilQualityRejudge(data) {
|
||||
return request({
|
||||
url: '/wms/coilQualityRejudge',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除钢卷质量改判记录
|
||||
export function delCoilQualityRejudge(rejudgeId) {
|
||||
return request({
|
||||
url: '/wms/coilQualityRejudge/' + rejudgeId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
@@ -5,7 +5,8 @@ export function listCoilWarehouseOperationLog(query) {
|
||||
return request({
|
||||
url: '/wms/coilWarehouseOperationLog/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
params: query,
|
||||
timeout: 100000,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
44
klp-ui/src/api/wms/exportFile.js
Normal file
44
klp-ui/src/api/wms/exportFile.js
Normal file
@@ -0,0 +1,44 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询报导出文件列表
|
||||
export function listExportFile(query) {
|
||||
return request({
|
||||
url: '/wms/exportFile/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询报导出文件详细
|
||||
export function getExportFile(id) {
|
||||
return request({
|
||||
url: '/wms/exportFile/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增报导出文件
|
||||
export function addExportFile(data) {
|
||||
return request({
|
||||
url: '/wms/exportFile',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改报导出文件
|
||||
export function updateExportFile(data) {
|
||||
return request({
|
||||
url: '/wms/exportFile',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除报导出文件
|
||||
export function delExportFile(id) {
|
||||
return request({
|
||||
url: '/wms/exportFile/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
@@ -122,10 +122,13 @@ export function startProcess(actionId) {
|
||||
}
|
||||
|
||||
// 完成操作
|
||||
export function completeAction(actionId) {
|
||||
export function completeAction(actionId, newCoilIds) {
|
||||
return request({
|
||||
url: `/wms/coilPendingAction/complete/${actionId}`,
|
||||
method: 'put'
|
||||
method: 'put',
|
||||
params: {
|
||||
newCoilIds: newCoilIds || '-'
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
39
klp-ui/src/api/wms/processPlan.js
Normal file
39
klp-ui/src/api/wms/processPlan.js
Normal file
@@ -0,0 +1,39 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export function listProcessPlan(query) {
|
||||
return request({
|
||||
url: '/wms/processPlan/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
export function getProcessPlan(planId) {
|
||||
return request({
|
||||
url: '/wms/processPlan/' + planId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function addProcessPlan(data) {
|
||||
return request({
|
||||
url: '/wms/processPlan',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function updateProcessPlan(data) {
|
||||
return request({
|
||||
url: '/wms/processPlan',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function delProcessPlan(planId) {
|
||||
return request({
|
||||
url: '/wms/processPlan/' + planId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
39
klp-ui/src/api/wms/processPlanParam.js
Normal file
39
klp-ui/src/api/wms/processPlanParam.js
Normal file
@@ -0,0 +1,39 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export function listProcessPlanParam(query) {
|
||||
return request({
|
||||
url: '/wms/processPlanParam/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
export function getProcessPlanParam(paramId) {
|
||||
return request({
|
||||
url: '/wms/processPlanParam/' + paramId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function addProcessPlanParam(data) {
|
||||
return request({
|
||||
url: '/wms/processPlanParam',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function updateProcessPlanParam(data) {
|
||||
return request({
|
||||
url: '/wms/processPlanParam',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function delProcessPlanParam(paramId) {
|
||||
return request({
|
||||
url: '/wms/processPlanParam/' + paramId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
44
klp-ui/src/api/wms/processSpec.js
Normal file
44
klp-ui/src/api/wms/processSpec.js
Normal file
@@ -0,0 +1,44 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 查询规程主表列表
|
||||
export function listProcessSpec(query) {
|
||||
return request({
|
||||
url: '/wms/processSpec/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
// 查询规程主表详细
|
||||
export function getProcessSpec(specId) {
|
||||
return request({
|
||||
url: '/wms/processSpec/' + specId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// 新增规程主表
|
||||
export function addProcessSpec(data) {
|
||||
return request({
|
||||
url: '/wms/processSpec',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 修改规程主表
|
||||
export function updateProcessSpec(data) {
|
||||
return request({
|
||||
url: '/wms/processSpec',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
// 删除规程主表
|
||||
export function delProcessSpec(specId) {
|
||||
return request({
|
||||
url: '/wms/processSpec/' + specId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
46
klp-ui/src/api/wms/processSpecVersion.js
Normal file
46
klp-ui/src/api/wms/processSpecVersion.js
Normal file
@@ -0,0 +1,46 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export function listProcessSpecVersion(query) {
|
||||
return request({
|
||||
url: '/wms/processSpecVersion/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
}
|
||||
|
||||
export function getProcessSpecVersion(versionId) {
|
||||
return request({
|
||||
url: '/wms/processSpecVersion/' + versionId,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function addProcessSpecVersion(data) {
|
||||
return request({
|
||||
url: '/wms/processSpecVersion',
|
||||
method: 'post',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function updateProcessSpecVersion(data) {
|
||||
return request({
|
||||
url: '/wms/processSpecVersion',
|
||||
method: 'put',
|
||||
data: data
|
||||
})
|
||||
}
|
||||
|
||||
export function activateProcessSpecVersion(versionId) {
|
||||
return request({
|
||||
url: '/wms/processSpecVersion/activate/' + versionId,
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
|
||||
export function delProcessSpecVersion(versionId) {
|
||||
return request({
|
||||
url: '/wms/processSpecVersion/' + versionId,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
@@ -42,3 +42,11 @@ export function delTransferOrder(orderId) {
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
// 审批调拨单
|
||||
export function approveTransferOrder(orderId, status) {
|
||||
return request({
|
||||
url: '/wms/transferOrder/approve/' + orderId + '/' + status,
|
||||
method: 'put'
|
||||
})
|
||||
}
|
||||
|
||||
@@ -944,6 +944,14 @@ body {
|
||||
}
|
||||
}
|
||||
|
||||
.el-dialog.is-fullscreen {
|
||||
.el-dialog__body {
|
||||
padding: $--spacing-lg;
|
||||
max-height: calc(100vh - 100px);
|
||||
overflow-y: auto;
|
||||
}
|
||||
}
|
||||
|
||||
// 抽屉
|
||||
.el-drawer {
|
||||
// background: $--metal-gradient-light;
|
||||
|
||||
@@ -47,12 +47,17 @@ function formatAreaText(value) {
|
||||
return { standard, custom };
|
||||
}
|
||||
|
||||
// 非组合格式(纯标准地址/纯自定义地址)→ 默认归为standard
|
||||
return { standard: trimVal, custom: '' };
|
||||
// 非组合格式(纯任意字符串)→ 归为custom
|
||||
return { standard: '', custom: trimVal };
|
||||
}
|
||||
|
||||
// ========== 场景3:输入是对象 → 格式化为组合字符串 ==========
|
||||
if (typeof value === 'object' && !Array.isArray(value)) {
|
||||
// 处理空对象
|
||||
if (Object.keys(value).length === 0) {
|
||||
return '[]()';
|
||||
}
|
||||
|
||||
const { standard = '', custom = '' } = value;
|
||||
// 转字符串并去空格
|
||||
const standardStr = String(standard).trim();
|
||||
@@ -71,11 +76,19 @@ function formatAreaText(value) {
|
||||
*/
|
||||
function formatAreaTextEnhanced(value, keyType = 'name') {
|
||||
// 先调用基础版解析/格式化
|
||||
const result = formatAreaText(value);
|
||||
let result = formatAreaText(value);
|
||||
|
||||
// 如果是解析模式(返回对象)且keyType为name,转换code为name
|
||||
// 如果是解析模式(返回对象)且keyType为name,检查是否为代码输入
|
||||
if (typeof result === 'object' && keyType === 'name') {
|
||||
result.standard = convertCodeToName(result.standard);
|
||||
// 检查custom是否可能是代码(不包含中文)
|
||||
if (result.custom && !/[\u4e00-\u9fa5]/.test(result.custom)) {
|
||||
// 尝试转换code为name
|
||||
const convertedName = convertCodeToName(result.custom);
|
||||
// 如果转换成功(返回非空字符串),则将其移到standard字段
|
||||
if (convertedName) {
|
||||
result = { standard: convertedName, custom: '' };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
|
||||
<script>
|
||||
import areaData from './data.js'
|
||||
import { formatAreaTextEnhanced } from './index.js'
|
||||
|
||||
export default {
|
||||
name: 'ChinaAreaSelectWithDetail',
|
||||
@@ -105,32 +106,9 @@ export default {
|
||||
* @param {String} val - 外部传入的「[标准地址](自定义地址)」格式值
|
||||
*/
|
||||
parseCombineValue(val) {
|
||||
if (!val) {
|
||||
this.areaValue = []
|
||||
this.detailAddress = ''
|
||||
return
|
||||
}
|
||||
|
||||
// 核心正则:匹配「[xxx](yyy)」格式,分组提取xxx和yyy(无匹配则为空)
|
||||
const reg = /\[([^\]]*)\]\(([^)]*)\)/
|
||||
const matchResult = val.match(reg)
|
||||
|
||||
// 提取标准地址(第一个分组)和自定义地址(第二个分组)
|
||||
const standardAddress = matchResult?.[1] || ''
|
||||
const customAddress = matchResult?.[2] || ''
|
||||
|
||||
// 1. 处理自定义地址:直接赋值
|
||||
this.detailAddress = customAddress.trim()
|
||||
|
||||
// 2. 处理标准地址:转换为区域选择器的code数组
|
||||
if (standardAddress) {
|
||||
const standardArr = standardAddress.split('/').filter(Boolean)
|
||||
this.areaValue = this.keyType === 'name'
|
||||
? this.convertNameToCode(standardArr) // name转code
|
||||
: standardArr.filter(code => !!areaData[code]) // code直接过滤无效值
|
||||
} else {
|
||||
this.areaValue = []
|
||||
}
|
||||
const formattedAddress = formatAreaTextEnhanced(val)
|
||||
this.areaValue = formattedAddress.standard.split('/').filter(Boolean)
|
||||
this.detailAddress = formattedAddress.custom.trim()
|
||||
},
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,6 +1,12 @@
|
||||
export const defaultColumns = [
|
||||
{
|
||||
label: '卷号',
|
||||
label: '入场卷号',
|
||||
align: 'center',
|
||||
prop: 'enterCoilNo',
|
||||
showOverflowTooltip: true
|
||||
},
|
||||
{
|
||||
label: '当前卷号',
|
||||
align: 'center',
|
||||
prop: 'currentCoilNo',
|
||||
showOverflowTooltip: true
|
||||
@@ -49,6 +55,13 @@ export const defaultColumns = [
|
||||
width: '120',
|
||||
showOverflowTooltip: true
|
||||
},
|
||||
{
|
||||
label: '创建时间',
|
||||
align: 'center',
|
||||
prop: 'createTime',
|
||||
width: '100',
|
||||
showOverflowTooltip: true
|
||||
},
|
||||
{
|
||||
label: '备注',
|
||||
align: 'center',
|
||||
|
||||
@@ -21,32 +21,39 @@
|
||||
@close="handleClose" append-to-body :fullscreen="orderBy">
|
||||
<!-- 搜索区域 -->
|
||||
<el-form v-if="!rangeMode" inline :model="queryParams" class="search-form">
|
||||
<!-- <el-form-item label="类型">
|
||||
<el-select v-model="queryParams.selectType" placeholder="请选择类型" size="small">
|
||||
<el-form-item label="入场卷号">
|
||||
<el-input v-model="queryParams.enterCoilNo" placeholder="请输入入场卷号" clearable size="small"
|
||||
@keyup.enter.native="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="当前卷号">
|
||||
<el-input v-model="queryParams.currentCoilNo" placeholder="请输入当前卷号" clearable size="small"
|
||||
@keyup.enter.native="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="物料类型">
|
||||
<el-select v-model="queryParams.itemType" placeholder="请选择物料类型" size="small" clearable>
|
||||
<el-option label="成品" value="product" />
|
||||
<el-option label="原料" value="raw_material" />
|
||||
</el-select>
|
||||
</el-form-item> -->
|
||||
<el-form-item label="卷号">
|
||||
<el-input v-model="queryParams.currentCoilNo" placeholder="请输入卷号" clearable size="small"
|
||||
@keyup.enter.native="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="物料">
|
||||
<muti-select v-model="queryParams.itemName" :options="dict.type.coil_itemname" placeholder="请选择物料"
|
||||
<el-form-item label="物料名称" v-if="queryParams.itemType">
|
||||
<muti-select v-model="queryParams.itemName" :options="dict.type.coil_itemname" placeholder="请选择物料名称"
|
||||
clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="规格">
|
||||
<el-form-item label="规格" v-if="queryParams.itemType">
|
||||
<memo-input storageKey="coilSpec" v-model="queryParams.itemSpecification" placeholder="请输入规格" clearable
|
||||
size="small" @keyup.enter.native="handleQuery" />
|
||||
</el-form-item>
|
||||
<el-form-item label="材质">
|
||||
<el-form-item label="材质" v-if="queryParams.itemType">
|
||||
<muti-select v-model="queryParams.itemMaterial" :options="dict.type.coil_material" placeholder="请选择材质"
|
||||
clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="厂家">
|
||||
<el-form-item label="厂家" v-if="queryParams.itemType">
|
||||
<muti-select v-model="queryParams.itemManufacturer" :options="dict.type.coil_manufacturer" placeholder="请选择厂家"
|
||||
clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="表面处理" v-if="queryParams.itemType">
|
||||
<el-input v-model="queryParams.itemSurfaceTreatmentDesc" placeholder="请输入表面处理" clearable size="small" />
|
||||
</el-form-item>
|
||||
<el-form-item label="切边" prop="trimmingRequirement" v-if="orderBy">
|
||||
<el-select v-model="queryParams.trimmingRequirement" placeholder="请选择切边" clearable style="width: 100%">
|
||||
<el-option label="净边" value="净边" />
|
||||
@@ -60,6 +67,10 @@
|
||||
<el-option label="简包" value="简包" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="品质">
|
||||
<muti-select v-model="queryParams.qualityStatusCsv" :options="dict.type.coil_quality_status"
|
||||
placeholder="请选择品质" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="实际库区" v-if="orderBy">
|
||||
<actual-warehouse-select v-model="queryParams.actualWarehouseId" placeholder="请选择实际库区" canSelectLevel2
|
||||
canSelectDisabled :clearInput="false" clearable />
|
||||
@@ -69,6 +80,8 @@
|
||||
<el-button type="primary" icon="el-icon-search" size="small" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="small" @click="resetQuery">重置</el-button>
|
||||
<el-checkbox v-if="orderBy" style="margin-left: 10px;" v-model="showCoilMap" size="small">显示钢卷地图</el-checkbox>
|
||||
<el-checkbox v-if="orderBy && orderId" style="margin-left: 10px;" v-model="showOrderInfo"
|
||||
size="small">显示订单详情</el-checkbox>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
@@ -78,6 +91,7 @@
|
||||
<!-- 自定义列 -->
|
||||
<el-table-column v-for="column in renderColumns" :label="column.label" :align="column.align" :prop="column.prop"
|
||||
:width="column.width" :show-overflow-tooltip="column.showOverflowTooltip" />
|
||||
<el-table-column v-if="orderBy" label="表面处理" prop="surfaceTreatmentDesc"></el-table-column>
|
||||
<el-table-column v-if="orderBy" label="品质" prop="qualityStatus"></el-table-column>
|
||||
<el-table-column v-if="orderBy" label="切边" prop="trimmingRequirement"></el-table-column>
|
||||
<el-table-column v-if="orderBy" label="包装" prop="packagingRequirement"></el-table-column>
|
||||
@@ -95,6 +109,7 @@
|
||||
<!-- 自定义列 -->
|
||||
<el-table-column v-for="column in renderColumns" :label="column.label" :align="column.align"
|
||||
:prop="column.prop" :width="column.width" :show-overflow-tooltip="column.showOverflowTooltip" />
|
||||
<el-table-column v-if="orderBy" label="表面处理" prop="surfaceTreatmentDesc"></el-table-column>
|
||||
<el-table-column v-if="orderBy" label="品质" prop="qualityStatus"></el-table-column>
|
||||
<el-table-column v-if="orderBy" label="切边" prop="trimmingRequirement"></el-table-column>
|
||||
<el-table-column v-if="orderBy" label="包装" prop="packagingRequirement"></el-table-column>
|
||||
@@ -102,8 +117,15 @@
|
||||
</div>
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination v-if="!rangeMode" v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize" @pagination="getList" />
|
||||
<div style="display: flex; justify-content: flex-end; align-items: flex-end; gap: 10px;">
|
||||
<span>
|
||||
总净重:{{ coilTrimStatistics.total_net_weight || 0 }}t
|
||||
</span>
|
||||
|
||||
<pagination v-if="!rangeMode" v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize" @pagination="getList" />
|
||||
</div>
|
||||
|
||||
|
||||
<div v-if="multiple && selectedCoils.length > 0" class="selected-stats">
|
||||
<div class="stats-content">
|
||||
@@ -121,7 +143,10 @@
|
||||
<el-table v-if="multiple && selectedCoils.length > 0" :data="selectedCoils">
|
||||
<el-table-column v-for="column in renderColumns" :label="column.label" :align="column.align" :prop="column.prop"
|
||||
:width="column.width" :show-overflow-tooltip="column.showOverflowTooltip" />
|
||||
<el-table-column v-if="orderBy" label="表面处理" prop="surfaceTreatmentDesc"></el-table-column>
|
||||
<el-table-column v-if="orderBy" label="品质" prop="qualityStatus"></el-table-column>
|
||||
<el-table-column v-if="orderBy" label="切边" prop="trimmingRequirement"></el-table-column>
|
||||
<el-table-column v-if="orderBy" label="包装" prop="packagingRequirement"></el-table-column>
|
||||
|
||||
<el-table-column label="操作" width="50">
|
||||
<template slot-scope="scope">
|
||||
@@ -147,12 +172,18 @@
|
||||
:id="selectedNodeId" :canToggle="false" :canRelease="false" />
|
||||
</div>
|
||||
</DragResizeBox>
|
||||
|
||||
<DragResizeBox v-if="orderBy && orderId && showOrderInfo" storageKey="coil-order-info">
|
||||
<div style="height: 100%; width: 100%; background-color: #fff;">
|
||||
<order-detail v-if="orderBy && orderId && showOrderInfo" :orderId="orderId" :editable="false" />
|
||||
</div>
|
||||
</DragResizeBox>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listMaterialCoil } from '@/api/wms/coil';
|
||||
import { listMaterialCoil, getCoilStatisticsList } from '@/api/wms/coil';
|
||||
import { listActualWarehouse } from "@/api/wms/actualWarehouse";
|
||||
import { treeActualWarehouseTwoLevel } from "@/api/wms/actualWarehouse";
|
||||
import MemoInput from '@/components/MemoInput/index.vue';
|
||||
@@ -161,6 +192,7 @@ import { defaultColumns } from './data';
|
||||
import ActualWarehouseSelect from '@/components/KLPService/ActualWarehouseSelect/index.vue';
|
||||
import WarehouseBirdMini from '@/views/wms/warehouse/components/WarehouseBirdMini.vue';
|
||||
import DragResizeBox from '@/components/DragResizeBox/index.vue';
|
||||
import OrderDetail from '@/views/crm/components/OrderDetail.vue';
|
||||
|
||||
export default {
|
||||
name: 'CoilSelector',
|
||||
@@ -169,9 +201,10 @@ export default {
|
||||
MutiSelect,
|
||||
ActualWarehouseSelect,
|
||||
WarehouseBirdMini,
|
||||
DragResizeBox
|
||||
DragResizeBox,
|
||||
OrderDetail
|
||||
},
|
||||
dicts: ['coil_itemname', 'coil_material', 'coil_manufacturer'],
|
||||
dicts: ['coil_itemname', 'coil_material', 'coil_manufacturer', 'coil_quality_status'],
|
||||
props: {
|
||||
// 非触发器模式下,外部控制显隐(触发器模式下无效)
|
||||
visible: {
|
||||
@@ -180,7 +213,7 @@ export default {
|
||||
},
|
||||
dialogWidth: {
|
||||
type: String,
|
||||
default: '1000px'
|
||||
default: '1200px'
|
||||
},
|
||||
// 过滤条件(可以预设一些查询条件)
|
||||
filters: {
|
||||
@@ -238,6 +271,14 @@ export default {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
orderId: {
|
||||
type: String,
|
||||
default: null
|
||||
},
|
||||
defaultType: {
|
||||
type: String,
|
||||
default: 'product'
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@@ -251,14 +292,15 @@ export default {
|
||||
selectedCoil: null,
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
pageSize: 50,
|
||||
currentCoilNo: null,
|
||||
grade: null,
|
||||
itemSpecification: null,
|
||||
itemMaterial: null,
|
||||
itemManufacturer: null,
|
||||
actualWarehouseId: null,
|
||||
selectType: 'product',
|
||||
itemType: this.defaultType,
|
||||
selectType: this.defaultType,
|
||||
status: 0, // 不包含已发货的钢卷
|
||||
dataType: 1 // 只查询当前数据,不查询历史数据
|
||||
},
|
||||
@@ -271,6 +313,8 @@ export default {
|
||||
warehouseTree: [],
|
||||
treeProps: { label: "actualWarehouseName", children: "children" },
|
||||
treeLoading: false,
|
||||
showOrderInfo: false,
|
||||
coilTrimStatistics: {},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -455,12 +499,18 @@ export default {
|
||||
...this.queryParams,
|
||||
...this.filters,
|
||||
};
|
||||
queryPayload.selectType = queryPayload.itemType;
|
||||
// 处于销售视角,且my视图时,只查询当前用户的钢卷
|
||||
console.log('this.salesRestricted', this.salesRestricted, this.currentTab, this.currentUserId);
|
||||
if (this.salesRestricted && this.currentTab === 'my') {
|
||||
queryPayload.saleId = this.currentUserId;
|
||||
}
|
||||
const response = await listMaterialCoil(queryPayload);
|
||||
const { pageNum, pageSize, excludeBound, orderBy, ...noPager } = queryPayload;
|
||||
getCoilStatisticsList(noPager).then((res) => {
|
||||
console.log('钢卷统计数据:', res);
|
||||
this.coilTrimStatistics = res.data || {};
|
||||
});
|
||||
if (response.code === 200) {
|
||||
this.coilList = response.rows || [];
|
||||
this.total = response.total || 0;
|
||||
@@ -506,7 +556,8 @@ export default {
|
||||
currentCoilNo: null,
|
||||
grade: null,
|
||||
dataType: 1,
|
||||
selectType: 'raw_material',
|
||||
itemType: this.defaultType,
|
||||
selectType: this.defaultType,
|
||||
};
|
||||
this.getList();
|
||||
},
|
||||
@@ -518,8 +569,9 @@ export default {
|
||||
this.$message.warning('您没有权限选择此钢卷');
|
||||
return; // 终止后续逻辑
|
||||
}
|
||||
if (this.disableO && row.qualityStatus == 'O') {
|
||||
this.$message.warning('O卷不能选择');
|
||||
const disabledOList = ['O', 'C+', 'C', 'C-', 'D+', 'D', 'D-']
|
||||
if (this.disableO && disabledOList.includes(row.qualityStatus)) {
|
||||
this.$message.warning(`${row.qualityStatus}卷不能选择`);
|
||||
return;
|
||||
}
|
||||
this.handleSelect(row);
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<div
|
||||
v-if="editable"
|
||||
@click="openDictDialog"
|
||||
style="cursor: pointer; height: 24px; width: 24px; margin-top: 4px; display: flex; align-items: center; justify-content: center; border: 1px solid #828991; margin-left: 8px; border-radius: 2px;"
|
||||
style="cursor: pointer; min-height: 24px; min-width: 24px; margin-top: 4px; display: flex; align-items: center; justify-content: center; border: 1px solid #828991; margin-left: 8px; border-radius: 2px;"
|
||||
>
|
||||
<i class="el-icon-setting"></i>
|
||||
</div>
|
||||
@@ -28,7 +28,7 @@
|
||||
<div
|
||||
v-if="refresh"
|
||||
@click="handleRefresh"
|
||||
style="cursor: pointer; height: 24px; width: 24px; margin-top: 4px; display: flex; align-items: center; justify-content: center; border: 1px solid #828991; margin-left: 8px; border-radius: 2px;"
|
||||
style="cursor: pointer; min-height: 24px; min-width: 24px; margin-top: 4px; display: flex; align-items: center; justify-content: center; border: 1px solid #828991; margin-left: 8px; border-radius: 2px;"
|
||||
>
|
||||
<i class="el-icon-refresh"></i>
|
||||
</div>
|
||||
@@ -52,7 +52,7 @@
|
||||
<el-row :gutter="15">
|
||||
<el-col :span="kisv ? 24 : 12">
|
||||
<el-form-item label="值/标签" prop="dictValue" v-if="kisv">
|
||||
<el-input v-model="form.dictValue" placeholder="请输入字典值(标签自动同步)" />
|
||||
<el-input v-model="form.dictValue" placeholder="请输入字典值,在此处输入用于新增字典项" />
|
||||
</el-form-item>
|
||||
<el-form-item label="字典标签" prop="dictLabel" v-else>
|
||||
<el-input v-model="form.dictLabel" placeholder="请输入字典标签" />
|
||||
|
||||
159
klp-ui/src/components/DragResizePanel/index.vue
Normal file
159
klp-ui/src/components/DragResizePanel/index.vue
Normal file
@@ -0,0 +1,159 @@
|
||||
<template>
|
||||
<div class="drag-resize-panel" :class="{ 'vertical': direction === 'vertical' }">
|
||||
<div class="panel-a" :style="panelAstyle">
|
||||
<slot name="panelA"></slot>
|
||||
</div>
|
||||
<div class="resizer" :class="{ 'vertical-resizer': direction === 'vertical' }" @mousedown="startResize"></div>
|
||||
<div class="panel-b" :style="panelBstyle">
|
||||
<slot name="panelB"></slot>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'DragResizePanel',
|
||||
props: {
|
||||
direction: {
|
||||
type: String,
|
||||
default: 'horizontal',
|
||||
validator: function(value) {
|
||||
return ['horizontal', 'vertical'].includes(value);
|
||||
}
|
||||
},
|
||||
// 设置panelA的初始大小,最大值和最小值,默认值为300px,10000px,100px
|
||||
// panelB占据剩余空间
|
||||
initialSize: {
|
||||
type: Number,
|
||||
default: 300
|
||||
},
|
||||
minSize: {
|
||||
type: Number,
|
||||
default: 100
|
||||
},
|
||||
maxSize: {
|
||||
type: Number,
|
||||
default: 10000
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
currentSize: this.initialSize,
|
||||
isResizing: false,
|
||||
startPosition: 0
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
panelAstyle() {
|
||||
if (this.direction === 'horizontal') {
|
||||
return { width: this.currentSize + 'px' };
|
||||
} else {
|
||||
return { height: this.currentSize + 'px' };
|
||||
}
|
||||
},
|
||||
panelBstyle() {
|
||||
if (this.direction === 'horizontal') {
|
||||
return { flex: 1 };
|
||||
} else {
|
||||
return { flex: 1 };
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
startResize(e) {
|
||||
e.preventDefault();
|
||||
this.isResizing = true;
|
||||
this.startPosition = this.direction === 'horizontal' ? e.clientX : e.clientY;
|
||||
this.startSize = this.currentSize;
|
||||
|
||||
document.addEventListener('mousemove', this.handleResize);
|
||||
document.addEventListener('mouseup', this.stopResize);
|
||||
},
|
||||
handleResize(e) {
|
||||
if (!this.isResizing) return;
|
||||
|
||||
const delta = this.direction === 'horizontal' ? e.clientX - this.startPosition : e.clientY - this.startPosition;
|
||||
const newSize = this.startSize + delta;
|
||||
|
||||
if (newSize >= this.minSize && newSize <= this.maxSize) {
|
||||
this.currentSize = newSize;
|
||||
}
|
||||
},
|
||||
stopResize() {
|
||||
this.isResizing = false;
|
||||
document.removeEventListener('mousemove', this.handleResize);
|
||||
document.removeEventListener('mouseup', this.stopResize);
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.drag-resize-panel {
|
||||
display: flex;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.drag-resize-panel.vertical {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.panel-a {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.panel-b {
|
||||
position: relative;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.resizer {
|
||||
width: 4px;
|
||||
cursor: col-resize;
|
||||
position: relative;
|
||||
transition: background-color 0.3s;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.resizer.vertical-resizer {
|
||||
width: 100%;
|
||||
height: 4px;
|
||||
cursor: row-resize;
|
||||
}
|
||||
|
||||
.resizer:hover {
|
||||
background-color: #409eff;
|
||||
}
|
||||
|
||||
.resizer::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
height: 40px;
|
||||
width: 2px;
|
||||
background-color: #c0c4cc;
|
||||
border-radius: 1px;
|
||||
transition: background-color 0.3s;
|
||||
}
|
||||
|
||||
.resizer.vertical-resizer::before {
|
||||
width: 40px;
|
||||
height: 2px;
|
||||
}
|
||||
|
||||
.resizer:hover::before {
|
||||
background-color: #409eff;
|
||||
}
|
||||
|
||||
.resizer:active {
|
||||
background-color: #409eff;
|
||||
}
|
||||
|
||||
.resizer:active::before {
|
||||
background-color: #fff;
|
||||
}
|
||||
</style>
|
||||
@@ -1,52 +1,61 @@
|
||||
<template>
|
||||
<div class="file-list-container">
|
||||
<el-table
|
||||
:data="fileList"
|
||||
border
|
||||
size="small"
|
||||
v-loading="loading"
|
||||
style="width: 100%;"
|
||||
>
|
||||
<el-table-column
|
||||
label="文件名"
|
||||
prop="originalName"
|
||||
min-width="200"
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<i class="el-icon-document" style="margin-right: 8px;"></i>
|
||||
{{ scope.row.originalName }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="操作"
|
||||
width="100"
|
||||
align="center"
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
type="text"
|
||||
icon="el-icon-download"
|
||||
@click="downloadFile(scope.row)"
|
||||
size="small"
|
||||
>
|
||||
下载
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 空数据提示 -->
|
||||
<div v-if="fileList.length === 0 && !loading" class="empty-tip">
|
||||
<el-empty description="暂无文件数据"></el-empty>
|
||||
</div>
|
||||
<!-- 自定义文件列表 -->
|
||||
<div v-else class="file-list" v-loading="loading">
|
||||
<div
|
||||
v-for="file in fileList"
|
||||
:key="file.ossId"
|
||||
class="file-item"
|
||||
>
|
||||
<div class="file-info">
|
||||
<i class="el-icon-document"></i>
|
||||
<span class="file-name">{{ file.originalName }}</span>
|
||||
</div>
|
||||
<div class="file-actions">
|
||||
<el-button
|
||||
type="text"
|
||||
icon="el-icon-view"
|
||||
@click="handlePreview(file)"
|
||||
size="small"
|
||||
class="preview-btn"
|
||||
>
|
||||
预览
|
||||
</el-button>
|
||||
<el-button
|
||||
type="text"
|
||||
icon="el-icon-download"
|
||||
@click="downloadFile(file)"
|
||||
size="small"
|
||||
class="download-btn"
|
||||
>
|
||||
下载
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 文件预览组件 -->
|
||||
<file-preview
|
||||
:visible.sync="previewVisible"
|
||||
:file-url="previewFileUrl"
|
||||
:file-name="previewFileName"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listByIds } from "@/api/system/oss";
|
||||
import FilePreview from "../FilePreview";
|
||||
|
||||
export default {
|
||||
name: "FileList",
|
||||
components: {
|
||||
FilePreview
|
||||
},
|
||||
props: {
|
||||
ossIds: {
|
||||
type: String,
|
||||
@@ -56,7 +65,11 @@ export default {
|
||||
data() {
|
||||
return {
|
||||
fileList: [],
|
||||
loading: false // 加载状态
|
||||
loading: false, // 加载状态
|
||||
// 预览相关
|
||||
previewVisible: false,
|
||||
previewFileUrl: '',
|
||||
previewFileName: ''
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
@@ -94,6 +107,12 @@ export default {
|
||||
return;
|
||||
}
|
||||
this.$download.oss(file.ossId);
|
||||
},
|
||||
// 预览文件
|
||||
handlePreview(file) {
|
||||
this.previewFileUrl = file.url;
|
||||
this.previewFileName = file.originalName;
|
||||
this.previewVisible = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -112,8 +131,64 @@ export default {
|
||||
height: 200px;
|
||||
}
|
||||
|
||||
::v-deep .el-table {
|
||||
--el-table-header-text-color: #606266;
|
||||
--el-table-row-hover-bg-color: #f5f7fa;
|
||||
.file-list {
|
||||
width: 100%;
|
||||
border: 1px solid #ebeef5;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.file-item {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 12px 16px;
|
||||
border-bottom: 1px solid #ebeef5;
|
||||
transition: background-color 0.3s;
|
||||
}
|
||||
|
||||
.file-actions {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.file-item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.file-item:hover {
|
||||
background-color: #f5f7fa;
|
||||
}
|
||||
|
||||
.file-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.file-info .el-icon-document {
|
||||
margin-right: 8px;
|
||||
color: #409eff;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.file-name {
|
||||
font-size: 14px;
|
||||
color: #606266;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.download-btn {
|
||||
margin: 0;
|
||||
font-size: 14px;
|
||||
color: #409eff;
|
||||
}
|
||||
|
||||
.download-btn:hover {
|
||||
color: #66b1ff;
|
||||
}
|
||||
</style>
|
||||
122
klp-ui/src/components/FilePreview/index.vue
Normal file
122
klp-ui/src/components/FilePreview/index.vue
Normal file
@@ -0,0 +1,122 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
:title="title"
|
||||
:visible.sync="dialogVisible"
|
||||
:width="width"
|
||||
:close-on-click-modal="false"
|
||||
destroy-on-close
|
||||
append-to-body
|
||||
@close="handleClose"
|
||||
>
|
||||
<!-- 图片预览 -->
|
||||
<ImagePreview v-if="fileType === 'image'" :src="fileUrl" />
|
||||
|
||||
<!-- PDF预览 -->
|
||||
<PdfPreview v-else-if="fileType === 'pdf'" :src="fileUrl" />
|
||||
|
||||
<!-- Word预览 -->
|
||||
<DocxPreview v-else-if="fileType === 'docx'" :src="fileUrl" />
|
||||
|
||||
<!-- Excel预览 (xlsx) -->
|
||||
<XlsxPreview v-else-if="fileType === 'xlsx'" :src="fileUrl" />
|
||||
|
||||
<!-- Excel预览 (xls) -->
|
||||
<XlsPreview v-else-if="fileType === 'xls'" :src="fileUrl" />
|
||||
|
||||
<!-- 不支持的文件类型 -->
|
||||
<div v-else class="preview-not-supported">
|
||||
<el-empty description="暂不支持预览此文件类型"></el-empty>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import ImagePreview from './preview/image/index.vue';
|
||||
import PdfPreview from './preview/pdf/index.vue';
|
||||
import DocxPreview from './preview/docx/index.vue';
|
||||
import XlsxPreview from './preview/xlsx/index.vue';
|
||||
import XlsPreview from './preview/xls/index.vue';
|
||||
|
||||
export default {
|
||||
name: "FilePreview",
|
||||
components: {
|
||||
ImagePreview,
|
||||
PdfPreview,
|
||||
DocxPreview,
|
||||
XlsxPreview,
|
||||
XlsPreview
|
||||
},
|
||||
props: {
|
||||
visible: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
fileUrl: {
|
||||
type: String,
|
||||
required: true
|
||||
},
|
||||
fileName: {
|
||||
type: String,
|
||||
default: "文件预览"
|
||||
},
|
||||
width: {
|
||||
type: String,
|
||||
default: "80%"
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: false
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
visible: {
|
||||
handler(val) {
|
||||
this.dialogVisible = val;
|
||||
},
|
||||
immediate: true
|
||||
},
|
||||
dialogVisible(val) {
|
||||
if (!val) {
|
||||
this.$emit('update:visible', false);
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
title() {
|
||||
return this.fileName || "文件预览";
|
||||
},
|
||||
fileType() {
|
||||
const fileName = this.fileName || '';
|
||||
const ext = fileName.split('.').pop()?.toLowerCase();
|
||||
if (['png', 'jpg', 'jpeg', 'bmp', 'webp'].includes(ext)) {
|
||||
return 'image';
|
||||
} else if (ext === 'pdf') {
|
||||
return 'pdf';
|
||||
} else if (ext === 'docx') {
|
||||
return 'docx';
|
||||
} else if (ext === 'xlsx') {
|
||||
return 'xlsx';
|
||||
} else if (ext === 'xls') {
|
||||
return 'xls';
|
||||
} else {
|
||||
return 'other';
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleClose() {
|
||||
this.$emit('update:visible', false);
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.preview-not-supported {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 400px;
|
||||
}
|
||||
</style>
|
||||
38
klp-ui/src/components/FilePreview/preview/docx/index.vue
Normal file
38
klp-ui/src/components/FilePreview/preview/docx/index.vue
Normal file
@@ -0,0 +1,38 @@
|
||||
<template>
|
||||
<div class="docx-preview">
|
||||
<vue-office-docx :src="src" @render-error="handleDocxError" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import VueOfficeDocx from '@vue-office/docx';
|
||||
import '@vue-office/docx/lib/index.css';
|
||||
|
||||
export default {
|
||||
name: "DocxPreview",
|
||||
components: {
|
||||
VueOfficeDocx
|
||||
},
|
||||
props: {
|
||||
src: {
|
||||
type: String,
|
||||
required: true,
|
||||
description: "Word文件的URL或路径"
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleDocxError(err) {
|
||||
console.error('docx预览失败:', err);
|
||||
this.$message.error('文档预览失败,请下载查看');
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.docx-preview {
|
||||
width: 100%;
|
||||
height: 70vh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
</style>
|
||||
99
klp-ui/src/components/FilePreview/preview/image/index.vue
Normal file
99
klp-ui/src/components/FilePreview/preview/image/index.vue
Normal file
@@ -0,0 +1,99 @@
|
||||
<template>
|
||||
<div class="preview-image">
|
||||
<div class="image-controls">
|
||||
<el-button type="primary" size="small" @click="zoomIn">放大</el-button>
|
||||
<el-button type="primary" size="small" @click="zoomOut">缩小</el-button>
|
||||
<el-button type="primary" size="small" @click="resetZoom">重置</el-button>
|
||||
</div>
|
||||
<div class="image-container" ref="imageContainer">
|
||||
<img
|
||||
:src="src"
|
||||
:style="{ transform: `scale(${scale})` }"
|
||||
class="preview-image-content"
|
||||
@wheel="handleWheel"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "ImagePreview",
|
||||
props: {
|
||||
src: {
|
||||
type: String,
|
||||
required: true,
|
||||
description: "图片文件的URL或路径"
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
scale: 1
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
// 放大图片
|
||||
zoomIn() {
|
||||
if (this.scale < 3) {
|
||||
this.scale += 0.1;
|
||||
}
|
||||
},
|
||||
// 缩小图片
|
||||
zoomOut() {
|
||||
if (this.scale > 0.1) {
|
||||
this.scale -= 0.1;
|
||||
}
|
||||
},
|
||||
// 重置缩放
|
||||
resetZoom() {
|
||||
this.scale = 1;
|
||||
},
|
||||
// 鼠标滚轮缩放
|
||||
handleWheel(event) {
|
||||
event.preventDefault();
|
||||
const delta = event.deltaY > 0 ? -0.1 : 0.1;
|
||||
if ((this.scale > 0.1 || delta > 0) && (this.scale < 3 || delta < 0)) {
|
||||
this.scale += delta;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.preview-image {
|
||||
width: 100%;
|
||||
height: 70vh;
|
||||
background-color: #f5f7fa;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.image-controls {
|
||||
padding: 10px;
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
border-bottom: 1px solid #e4e7ed;
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
.image-container {
|
||||
flex: 1;
|
||||
overflow: auto;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: flex-start;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.preview-image-content {
|
||||
transition: transform 0.3s ease;
|
||||
cursor: zoom-in;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
|
||||
.preview-image-content:hover {
|
||||
cursor: zoom-in;
|
||||
}
|
||||
</style>
|
||||
34
klp-ui/src/components/FilePreview/preview/pdf/index.vue
Normal file
34
klp-ui/src/components/FilePreview/preview/pdf/index.vue
Normal file
@@ -0,0 +1,34 @@
|
||||
<template>
|
||||
<div class="preview-pdf">
|
||||
<iframe
|
||||
:src="src"
|
||||
class="preview-pdf-content"
|
||||
frameborder="0"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: "PdfPreview",
|
||||
props: {
|
||||
src: {
|
||||
type: String,
|
||||
required: true,
|
||||
description: "PDF文件的URL或路径"
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.preview-pdf {
|
||||
width: 100%;
|
||||
height: 70vh;
|
||||
}
|
||||
|
||||
.preview-pdf-content {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
238
klp-ui/src/components/FilePreview/preview/xls/index.vue
Normal file
238
klp-ui/src/components/FilePreview/preview/xls/index.vue
Normal file
@@ -0,0 +1,238 @@
|
||||
<template>
|
||||
<div class="xls-preview">
|
||||
<!-- 加载状态 -->
|
||||
<div v-if="loading" class="loading">
|
||||
<div class="spinner"></div>
|
||||
<p>正在加载Excel文件...</p>
|
||||
</div>
|
||||
|
||||
<!-- 错误信息 -->
|
||||
<div v-if="error" class="error">{{ error }}</div>
|
||||
|
||||
<!-- Excel内容展示 -->
|
||||
<div v-if="workbook" class="workbook-container">
|
||||
<!-- 工作表标签 -->
|
||||
<div class="sheet-tabs">
|
||||
<button v-for="(sheet, index) in workbook.SheetNames" :key="index"
|
||||
:class="{ active: activeSheetIndex === index }" @click="activeSheetIndex = index">
|
||||
{{ sheet }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- 表格内容区域 -->
|
||||
<div class="sheet-content">
|
||||
<table v-if="activeSheetData">
|
||||
<tbody>
|
||||
<tr v-for="(row, rowIndex) in activeSheetData" :key="rowIndex">
|
||||
<td v-for="(cell, colIndex) in row" :key="colIndex" :class="{
|
||||
'header-cell': rowIndex === 0,
|
||||
'odd-row': rowIndex % 2 === 1
|
||||
}">
|
||||
{{ cell || '' }}
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import * as XLSX from 'xlsx';
|
||||
|
||||
export default {
|
||||
name: "XlsPreview",
|
||||
props: {
|
||||
src: {
|
||||
type: String,
|
||||
required: true,
|
||||
description: "Excel文件的URL或路径"
|
||||
}
|
||||
},
|
||||
data () {
|
||||
return {
|
||||
workbook: null, // 解析后的Excel工作簿
|
||||
activeSheetIndex: 0, // 当前激活的工作表索引
|
||||
loading: false, // 加载状态
|
||||
error: null // 错误信息
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
src: {
|
||||
immediate: true,
|
||||
handler () {
|
||||
this.loadAndParseExcel();
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
// 获取当前激活的工作表数据
|
||||
activeSheetData () {
|
||||
if (!this.workbook || !this.workbook.SheetNames.length) return null;
|
||||
|
||||
const sheetName = this.workbook.SheetNames[this.activeSheetIndex];
|
||||
const worksheet = this.workbook.Sheets[sheetName];
|
||||
|
||||
// 将工作表转换为二维数组
|
||||
return XLSX.utils.sheet_to_json(worksheet, { header: 1 });
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* 加载并解析Excel文件
|
||||
*/
|
||||
async loadAndParseExcel () {
|
||||
this.loading = true;
|
||||
this.error = null;
|
||||
this.workbook = null;
|
||||
|
||||
try {
|
||||
// 验证URL格式
|
||||
if (!this.src || (this.src.startsWith('http') && !this.isValidUrl(this.src))) {
|
||||
throw new Error('无效的文件路径');
|
||||
}
|
||||
|
||||
// 加载文件
|
||||
const response = await fetch(this.src);
|
||||
if (!response.ok) {
|
||||
throw new Error(`加载失败: ${response.status} ${response.statusText}`);
|
||||
}
|
||||
|
||||
// 转换为ArrayBuffer
|
||||
const arrayBuffer = await response.arrayBuffer();
|
||||
|
||||
// 解析Excel
|
||||
this.workbook = XLSX.read(arrayBuffer, {
|
||||
type: 'array',
|
||||
cellDates: true, // 解析日期类型
|
||||
cellText: false // 保持单元格原始类型
|
||||
});
|
||||
|
||||
// 重置到第一个工作表
|
||||
this.activeSheetIndex = 0;
|
||||
} catch (err) {
|
||||
this.error = err.message;
|
||||
console.error('Excel处理错误:', err);
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* 验证URL格式
|
||||
*/
|
||||
isValidUrl (url) {
|
||||
try {
|
||||
new URL(url);
|
||||
return true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.xls-preview {
|
||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
||||
border: 1px solid #e5e7eb;
|
||||
border-radius: 6px;
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
height: 70vh;
|
||||
}
|
||||
|
||||
/* 加载状态样式 */
|
||||
.loading {
|
||||
padding: 40px 20px;
|
||||
text-align: center;
|
||||
color: #6b7280;
|
||||
}
|
||||
|
||||
.spinner {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
margin: 0 auto 16px;
|
||||
border: 4px solid #e5e7eb;
|
||||
border-top-color: #3b82f6;
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
to {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
/* 错误信息样式 */
|
||||
.error {
|
||||
padding: 20px;
|
||||
color: #dc2626;
|
||||
background-color: #fee2e2;
|
||||
border-bottom: 1px solid #fecaca;
|
||||
}
|
||||
|
||||
/* 工作表标签样式 */
|
||||
.sheet-tabs {
|
||||
display: flex;
|
||||
background-color: #f9fafb;
|
||||
border-bottom: 1px solid #e5e7eb;
|
||||
overflow-x: auto;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.sheet-tabs button {
|
||||
padding: 8px 16px;
|
||||
border: none;
|
||||
background: none;
|
||||
font-size: 14px;
|
||||
color: #4b5563;
|
||||
cursor: pointer;
|
||||
border-bottom: 2px solid transparent;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.sheet-tabs button:hover:not(.active) {
|
||||
background-color: #f3f4f6;
|
||||
color: #1f2937;
|
||||
}
|
||||
|
||||
.sheet-tabs button.active {
|
||||
border-bottom-color: #3b82f6;
|
||||
color: #3b82f6;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* 表格内容样式 */
|
||||
.sheet-content {
|
||||
overflow: auto;
|
||||
max-height: 600px;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
min-width: max-content;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 8px 12px;
|
||||
border: 1px solid #e5e7eb;
|
||||
min-width: 80px;
|
||||
font-size: 14px;
|
||||
color: #1f2937;
|
||||
}
|
||||
|
||||
.header-cell {
|
||||
background-color: #f3f4f6;
|
||||
font-weight: 500;
|
||||
color: #111827;
|
||||
}
|
||||
|
||||
.odd-row {
|
||||
background-color: #f9fafb;
|
||||
}
|
||||
</style>
|
||||
42
klp-ui/src/components/FilePreview/preview/xlsx/index.vue
Normal file
42
klp-ui/src/components/FilePreview/preview/xlsx/index.vue
Normal file
@@ -0,0 +1,42 @@
|
||||
<template>
|
||||
<div class="xlsx-preview" :style="{ height: height }">
|
||||
<vue-office-excel :src="src" @render-error="handleExcelError" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import VueOfficeExcel from '@vue-office/excel';
|
||||
import '@vue-office/excel/lib/index.css';
|
||||
|
||||
export default {
|
||||
name: "XlsxPreview",
|
||||
components: {
|
||||
VueOfficeExcel
|
||||
},
|
||||
props: {
|
||||
src: {
|
||||
type: String,
|
||||
required: true,
|
||||
description: "Excel文件的URL或路径"
|
||||
},
|
||||
height: {
|
||||
type: String,
|
||||
default: "70vh",
|
||||
description: "预览区域高度"
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleExcelError(err) {
|
||||
console.error('excel预览失败:', err);
|
||||
this.$message.error('Excel预览失败,请下载查看');
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.xlsx-preview {
|
||||
width: 100%;
|
||||
overflow-y: auto;
|
||||
}
|
||||
</style>
|
||||
@@ -32,19 +32,31 @@
|
||||
<span class="el-icon-document"> {{ getFileName(file.name) }} </span>
|
||||
</el-link>
|
||||
<div class="ele-upload-list__item-content-action">
|
||||
<el-link :underline="false" @click="handlePreview(file)" type="primary">预览</el-link>
|
||||
<el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link>
|
||||
</div>
|
||||
</li>
|
||||
</transition-group>
|
||||
|
||||
<!-- 文件预览组件 -->
|
||||
<file-preview
|
||||
:visible.sync="previewVisible"
|
||||
:file-url="previewFileUrl"
|
||||
:file-name="previewFileName"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getToken } from "@/utils/auth";
|
||||
import { listByIds, delOss } from "@/api/system/oss";
|
||||
import FilePreview from "../FilePreview";
|
||||
|
||||
export default {
|
||||
name: "FileUpload",
|
||||
components: {
|
||||
FilePreview
|
||||
},
|
||||
props: {
|
||||
// 值
|
||||
value: [String, Object, Array],
|
||||
@@ -85,6 +97,10 @@ export default {
|
||||
},
|
||||
fileList: [],
|
||||
loading: false,
|
||||
// 预览相关
|
||||
previewVisible: false,
|
||||
previewFileUrl: '',
|
||||
previewFileName: ''
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
@@ -232,6 +248,12 @@ export default {
|
||||
}
|
||||
return strs != "" ? strs.substr(0, strs.length - 1) : "";
|
||||
},
|
||||
// 预览文件
|
||||
handlePreview(file) {
|
||||
this.previewFileUrl = file.url;
|
||||
this.previewFileName = file.name;
|
||||
this.previewVisible = true;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
269
klp-ui/src/components/KLPService/ContractSelect/index.vue
Normal file
269
klp-ui/src/components/KLPService/ContractSelect/index.vue
Normal file
@@ -0,0 +1,269 @@
|
||||
<template>
|
||||
<div>
|
||||
<div style="display: flex; align-items: center; margin-bottom: 12px;">
|
||||
<el-select v-model="selectedValue" placeholder="请选择合同" style="width: 100%">
|
||||
<el-option v-for="item in contractList" :key="item.orderId" :value="item.orderId"
|
||||
:label="item.contractCode" />
|
||||
</el-select>
|
||||
<!-- 编辑按钮:点击打开弹窗 -->
|
||||
<el-button v-if="mode == 'today'" @click="openSelectDialog" type="primary" size="small" style="margin-left: 8px; padding: 0 12px;">
|
||||
<i class="el-icon-setting"></i>
|
||||
</el-button>
|
||||
|
||||
<!-- 刷新时不会移除手动添加的合同 -->
|
||||
<el-button @click="handleRefresh" type="info" size="small" style="margin-left: 8px; padding: 0 12px;">
|
||||
<i class="el-icon-refresh"></i>
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<!-- 查询所有的合同和当前localstorage中的合同,可以对localstorage中的合同进行新增和删除,手动新增的合同带有手动添加的标记 -->
|
||||
<el-dialog title="可选合同配置" :visible.sync="dialogVisible" width="80%">
|
||||
<el-tabs v-model="activeTab">
|
||||
<!-- 已配置合同tab -->
|
||||
<el-tab-pane label="可选合同" name="configured">
|
||||
<div v-if="contractList.length === 0" style="text-align: center; padding: 20px;">
|
||||
暂无已配置合同
|
||||
</div>
|
||||
<el-table v-else :data="contractList" style="width: 100%" size="mini" height="600">
|
||||
<el-table-column prop="contractCode" label="合同编号" width="160" />
|
||||
<el-table-column prop="contractName" label="合同名称" width="180" />
|
||||
<el-table-column prop="customer" label="客户" width="140" />
|
||||
<el-table-column prop="salesman" label="销售人员" width="100" />
|
||||
<el-table-column prop="deliveryDate" label="交付日期" width="110">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.deliveryDate || '-' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="remark" label="备注" show-overflow-tooltip />
|
||||
<el-table-column label="添加方式" width="90">
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="scope.row.isManual" type="success" size="small">手动</el-tag>
|
||||
<el-tag v-else type="info" size="small">接口</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="70">
|
||||
<template slot-scope="scope">
|
||||
<el-button type="danger" size="mini" @click="removeContract(scope.row.orderId)" plain>
|
||||
移除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-tab-pane>
|
||||
|
||||
<!-- 所有合同tab -->
|
||||
<el-tab-pane label="所有合同" name="all">
|
||||
<div style="margin-bottom: 16px;">
|
||||
<el-input v-model="searchKeyword" placeholder="搜索合同" @input="handleSearch" clearable size="small">
|
||||
<el-button slot="append" icon="el-icon-search" size="small"></el-button>
|
||||
</el-input>
|
||||
</div>
|
||||
|
||||
<el-table :data="allContracts" style="width: 100%" size="mini" height="600">
|
||||
<el-table-column prop="contractCode" label="合同编号" width="160" />
|
||||
<el-table-column prop="contractName" label="合同名称" width="180" />
|
||||
<el-table-column prop="customer" label="客户" width="140" />
|
||||
<el-table-column prop="salesman" label="销售人员" width="100" />
|
||||
<el-table-column prop="deliveryDate" label="交付日期" width="110">
|
||||
<template slot-scope="scope">
|
||||
{{ scope.row.deliveryDate || '-' }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="remark" label="备注" show-overflow-tooltip />
|
||||
<el-table-column label="状态" width="80">
|
||||
<template slot-scope="scope">
|
||||
<el-tag v-if="isContractInList(scope.row.orderId)" type="success" size="small">已添加</el-tag>
|
||||
<el-tag v-else type="info" size="small">未添加</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="100">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
v-if="!isContractInList(scope.row.orderId)"
|
||||
type="primary"
|
||||
size="mini"
|
||||
@click="addContract(scope.row)"
|
||||
plain
|
||||
>
|
||||
添加
|
||||
</el-button>
|
||||
<el-button
|
||||
v-else
|
||||
type="danger"
|
||||
size="mini"
|
||||
@click="removeContract(scope.row.orderId)"
|
||||
plain
|
||||
>
|
||||
移除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<div v-if="allContracts.length === 0" style="text-align: center; padding: 20px;">
|
||||
暂无合同数据
|
||||
</div>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listOrder, listTodayOrder } from '@/api/crm/order';
|
||||
|
||||
export default {
|
||||
name: "ContractSelect",
|
||||
props: {
|
||||
value: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
mode: {
|
||||
type: String,
|
||||
default: "today" // today 或 all
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
contractList: [],
|
||||
dialogVisible: false,
|
||||
searchKeyword: '',
|
||||
allContracts: [],
|
||||
activeTab: 'configured', // 默认显示已配置合同tab
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
selectedValue: {
|
||||
get() {
|
||||
return this.value;
|
||||
},
|
||||
set(val) {
|
||||
this.$emit('input', val);
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
if (this.mode == "today") {
|
||||
// 从localstorage中获取合同列表
|
||||
this.loadFromLocalStorage();
|
||||
} else {
|
||||
this.loadContractList();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 从localStorage中加载合同列表
|
||||
loadFromLocalStorage() {
|
||||
try {
|
||||
const storedContracts = localStorage.getItem('todayContracts');
|
||||
if (storedContracts) {
|
||||
this.contractList = JSON.parse(storedContracts);
|
||||
} else {
|
||||
// 如果localStorage中没有,从接口获取
|
||||
this.loadContractList();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to load contracts from localStorage:', error);
|
||||
this.loadContractList();
|
||||
}
|
||||
},
|
||||
|
||||
// 保存合同列表到localStorage
|
||||
saveToLocalStorage() {
|
||||
try {
|
||||
localStorage.setItem('todayContracts', JSON.stringify(this.contractList));
|
||||
} catch (error) {
|
||||
console.error('Failed to save contracts to localStorage:', error);
|
||||
}
|
||||
},
|
||||
|
||||
// 加载合同列表
|
||||
async loadContractList(keyword) {
|
||||
if (this.mode == "all") {
|
||||
const res = await listOrder({
|
||||
pageNum: 1,
|
||||
pageSize: 1000,
|
||||
keyword: keyword || undefined,
|
||||
});
|
||||
this.contractList = res.rows || [];
|
||||
}
|
||||
else if (this.mode == "today") {
|
||||
const res = await listTodayOrder();
|
||||
// 获取现有手动添加的合同
|
||||
const existingManualContracts = this.contractList.filter(item => item.isManual);
|
||||
// 将接口返回的合同标记为非手动添加
|
||||
const apiContracts = (res.data || []).map(item => ({
|
||||
...item,
|
||||
isManual: false
|
||||
}));
|
||||
// 合并合同列表,保留手动添加的合同
|
||||
this.contractList = [...apiContracts, ...existingManualContracts];
|
||||
// 去重,避免重复合同
|
||||
this.contractList = this.contractList.filter((item, index, self) =>
|
||||
index === self.findIndex(t => t.orderId === item.orderId)
|
||||
);
|
||||
// 保存到localStorage
|
||||
this.saveToLocalStorage();
|
||||
}
|
||||
},
|
||||
// 打开选择弹窗
|
||||
async openSelectDialog() {
|
||||
this.dialogVisible = true;
|
||||
// 加载所有合同供选择
|
||||
await this.loadAllContracts();
|
||||
},
|
||||
|
||||
// 加载所有合同
|
||||
async loadAllContracts() {
|
||||
try {
|
||||
const res = await listOrder({
|
||||
pageNum: 1,
|
||||
pageSize: 1000,
|
||||
keyword: this.searchKeyword || undefined,
|
||||
});
|
||||
// 合并现有合同(包括手动添加的)
|
||||
const existingContracts = this.contractList;
|
||||
this.allContracts = [...res.rows || [], ...existingContracts].filter((item, index, self) =>
|
||||
index === self.findIndex(t => t.orderId === item.orderId)
|
||||
);
|
||||
} catch (error) {
|
||||
console.error('Failed to load all contracts:', error);
|
||||
this.allContracts = [];
|
||||
}
|
||||
},
|
||||
|
||||
// 搜索合同
|
||||
handleSearch() {
|
||||
this.loadAllContracts();
|
||||
},
|
||||
|
||||
// 检查合同是否在列表中
|
||||
isContractInList(orderId) {
|
||||
return this.contractList.some(item => item.orderId === orderId);
|
||||
},
|
||||
|
||||
// 添加合同
|
||||
addContract(contract) {
|
||||
if (!this.isContractInList(contract.orderId)) {
|
||||
this.contractList.push({
|
||||
...contract,
|
||||
isManual: true // 标记为手动添加
|
||||
});
|
||||
this.saveToLocalStorage();
|
||||
}
|
||||
},
|
||||
|
||||
// 移除合同
|
||||
removeContract(orderId) {
|
||||
this.contractList = this.contractList.filter(item => item.orderId !== orderId);
|
||||
this.saveToLocalStorage();
|
||||
},
|
||||
|
||||
// 刷新合同列表
|
||||
handleRefresh() {
|
||||
this.loadContractList();
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<el-select filterable v-model="_customerId" remote :remote-method="remoteSearchCustomer" :loading="customerLoading" placeholder="请选择客户">
|
||||
<el-option v-for="item in customerList" :key="item.customerId" :label="item.name" :value="item.customerId" />
|
||||
<el-select filterable v-model="_customerId" remote :remote-method="remoteSearchCustomer" :style="style" :loading="customerLoading" placeholder="请选择客户">
|
||||
<el-option v-for="item in customerList" :key="item[bindField]" :label="item.companyName" :value="item[bindField]" />
|
||||
</el-select>
|
||||
</template>
|
||||
|
||||
@@ -13,6 +13,14 @@
|
||||
value: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
bindField: {
|
||||
type: String,
|
||||
default: 'customerId'
|
||||
},
|
||||
style: {
|
||||
type: Object,
|
||||
default: () => ({})
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -22,6 +30,12 @@
|
||||
},
|
||||
set(value) {
|
||||
this.$emit('input', value);
|
||||
// 找到对应的客户信息
|
||||
const customer = this.customerList.find(item => item[this.bindField] === value);
|
||||
// 触发 change 事件,传递客户信息
|
||||
if (customer) {
|
||||
this.$emit('change', customer);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -37,7 +51,7 @@
|
||||
methods: {
|
||||
remoteSearchCustomer(query) {
|
||||
this.customerLoading = true;
|
||||
listCustomer({ name: query, pageNum: 1, pageSize: 10 }).then(response => {
|
||||
listCustomer({ companyName: query, pageNum: 1, pageSize: 10 }).then(response => {
|
||||
this.customerList = response.rows;
|
||||
}).finally(() => {
|
||||
this.customerLoading = false;
|
||||
|
||||
@@ -275,7 +275,7 @@ export default {
|
||||
// 选中项不在列表则追加,保证选中高亮
|
||||
if (this.selectedId && !this.productList.some(item => item.productId === this.selectedId)) {
|
||||
const res = await getProduct(this.selectedId);
|
||||
res.code === 200 && this.productList.push(res.data);
|
||||
res.code === 200 && res.data && this.productList.push(res.data);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
@@ -360,7 +360,7 @@ export default {
|
||||
// 选中的项不在列表中则追加进去,保证选中高亮
|
||||
if (this.selectedId && !this.rawMaterialList.some(item => item.rawMaterialId === this.selectedId)) {
|
||||
const res = await getRawMaterial(this.selectedId);
|
||||
res.code === 200 && this.rawMaterialList.push(res.data);
|
||||
res.code === 200 && res.data && this.rawMaterialList.push(res.data);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user