【需求开发】完善变更订单功能

pull/1/head
zengchenxi 9 months ago
parent 916a21132e
commit b47e5db1f4

@ -32,6 +32,11 @@
<artifactId>mes-module-system-biz</artifactId> <artifactId>mes-module-system-biz</artifactId>
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<dependency>
<groupId>com.chanko.yunxi</groupId>
<artifactId>mes-module-infra-biz</artifactId>
<version>${revision}</version>
</dependency>
<!-- 业务组件 --> <!-- 业务组件 -->
<dependency> <dependency>
@ -117,6 +122,12 @@
<artifactId>mes-spring-boot-starter-file</artifactId> <artifactId>mes-spring-boot-starter-file</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.github.dadiyang</groupId>
<artifactId>equator</artifactId>
<version>1.0.4</version>
</dependency>
</dependencies> </dependencies>
</project> </project>

@ -1,15 +1,15 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo; package com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.chanko.yunxi.mes.framework.excel.core.annotations.DictFormat;
import com.chanko.yunxi.mes.framework.excel.core.convert.DictConvert;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.Data;
import java.util.*;
import java.util.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*; import java.util.Set;
import com.chanko.yunxi.mes.framework.excel.core.annotations.DictFormat;
import com.chanko.yunxi.mes.framework.excel.core.convert.DictConvert;
@Schema(description = "管理后台 - 项目订单 Response VO") @Schema(description = "管理后台 - 项目订单 Response VO")
@Data @Data
@ -173,4 +173,7 @@ public class ProjectOrderRespVO {
@ExcelProperty("快照原始单据日期") @ExcelProperty("快照原始单据日期")
private LocalDateTime snapshotOrderTime; private LocalDateTime snapshotOrderTime;
@Schema(description = "变更的字段列表")
private Set<String> alterFieldNames;
} }

@ -102,7 +102,6 @@ public class ProjectOrderSaveReqVO {
private Integer hasBlueprint; private Integer hasBlueprint;
@Schema(description = "图纸/数模 说明", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜") @Schema(description = "图纸/数模 说明", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜")
@NotEmpty(message = "图纸/数模 说明不能为空")
private String blueprintRemark; private String blueprintRemark;
@Schema(description = "状态,1表示正常2表示禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @Schema(description = "状态,1表示正常2表示禁用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")

@ -1,18 +1,18 @@
package com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder; package com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum; import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderStatusEnum; import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderStatusEnum;
import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum; import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum;
import lombok.*; import lombok.*;
import java.util.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalDateTime; import java.util.Set;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
/** /**
* DO * DO
@ -196,6 +196,12 @@ public class ProjectOrderDO extends BaseDO {
@TableField(exist = false) @TableField(exist = false)
private String businessManName; private String businessManName;
/**
*
* */
@TableField(exist = false)
private Set<String> alterFieldNames;
public boolean canSave(){ public boolean canSave(){
return this.orderStatus.intValue() <= ProjectOrderStatusEnum.SAVE.getCode(); return this.orderStatus.intValue() <= ProjectOrderStatusEnum.SAVE.getCode();
} }

@ -1,11 +1,13 @@
package com.chanko.yunxi.mes.module.heli.dal.dataobject.projectordersub; package com.chanko.yunxi.mes.module.heli.dal.dataobject.projectordersub;
import lombok.*; import com.baomidou.mybatisplus.annotation.KeySequence;
import java.util.*; import com.baomidou.mybatisplus.annotation.TableField;
import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.*;
import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO; import com.chanko.yunxi.mes.framework.mybatis.core.dataobject.BaseDO;
import lombok.*;
import java.util.Set;
/** /**
* DO * DO
@ -64,5 +66,10 @@ public class ProjectOrderSubDO extends BaseDO {
* *
*/ */
private Boolean deleted; private Boolean deleted;
/**
*
* */
@TableField(exist = false)
private Set<String> alterFieldNames;
} }

@ -17,6 +17,12 @@ import com.chanko.yunxi.mes.module.heli.enums.ProjectOrderStatusEnum;
import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum; import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum;
import com.chanko.yunxi.mes.module.heli.service.customer.CustomerService; import com.chanko.yunxi.mes.module.heli.service.customer.CustomerService;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService; import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FilePageReqVO;
import com.chanko.yunxi.mes.module.infra.dal.dataobject.file.FileDO;
import com.chanko.yunxi.mes.module.infra.service.file.FileService;
import com.github.dadiyang.equator.FieldInfo;
import com.github.dadiyang.equator.GetterBaseEquator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -24,8 +30,8 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Date; import java.util.*;
import java.util.List; import java.util.stream.Collectors;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PROJECT_ORDER; import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PROJECT_ORDER;
@ -37,10 +43,13 @@ import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.PROJECT_
* *
* @author * @author
*/ */
@Slf4j
@Service @Service
@Validated @Validated
public class ProjectOrderServiceImpl implements ProjectOrderService { public class ProjectOrderServiceImpl implements ProjectOrderService {
private static final GetterBaseEquator FIELD_EQUATOR = new GetterBaseEquator();
@Resource @Resource
private ProjectOrderMapper projectOrderMapper; private ProjectOrderMapper projectOrderMapper;
@Resource @Resource
@ -52,6 +61,9 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
@Resource @Resource
private CustomerService customerService; private CustomerService customerService;
@Resource
private FileService fileService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createProjectOrder(ProjectOrderSaveReqVO createReqVO) { public Long createProjectOrder(ProjectOrderSaveReqVO createReqVO) {
@ -92,8 +104,24 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
.setOrderTime(LocalDateTime.now()) .setOrderTime(LocalDateTime.now())
; ;
projectOrderMapper.insert(projectOrder); projectOrderMapper.insert(projectOrder);
// 子项目
createProjectOrderSubList(projectOrder.getId(), createReqVO.getProjectOrderSubs()); createProjectOrderSubList(projectOrder.getId(), createReqVO.getProjectOrderSubs());
// 附件
PageResult<FileDO> filePage = fileService.getFilePage(new FilePageReqVO() {{
setPageNo(1);
setPageSize(99);
setBusinessId(createReqVO.getId());
setBusinessType(BusinesTypeEnum.PROJECT_ORDER.name());
}});
if(filePage.getTotal() > 0){
List<FileDO> list = filePage.getList();
list.forEach(fileDO -> {
fileDO.setId(null)
.setBusinessId(projectOrder.getId())
.setBusinessType(BusinesTypeEnum.PROJECT_ORDER_SNAPSHOT.name());
});
fileService.insertBatch(list);
}
// 回写序列记录 // 回写序列记录
serialNumberService.updateSerialNumber(serialNumberDO); serialNumberService.updateSerialNumber(serialNumberDO);
} }
@ -144,7 +172,55 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
@Override @Override
public ProjectOrderDO getProjectOrder(Long id) { public ProjectOrderDO getProjectOrder(Long id) {
return projectOrderMapper.selectById(id); ProjectOrderDO projectOrderDO = projectOrderMapper.selectById(id);
// 查询最近归档历史并对比变化字段
try {
ProjectOrderDO lastSnapshot = projectOrderMapper.selectOne(new LambdaQueryWrapper<ProjectOrderDO>() {{
eq(ProjectOrderDO::getSnapshotId, id);
orderByDesc(ProjectOrderDO::getId);
last("LIMIT 1");
}});
if(lastSnapshot != null){
List<FieldInfo> diffFields = FIELD_EQUATOR.getDiffFields(projectOrderDO, lastSnapshot);
projectOrderDO.setAlterFieldNames(diffFields.stream().map(FieldInfo::getFieldName).collect(Collectors.toSet()));
// 附件
List<FileDO> fileList = new ArrayList<>(16);
PageResult<FileDO> filePage = fileService.getFilePage(new FilePageReqVO() {{
setPageNo(1);
setPageSize(99);
setBusinessId(id);
setBusinessType(BusinesTypeEnum.PROJECT_ORDER.name());
}});
if(filePage.getTotal() > 0) {
fileList.addAll(filePage.getList());
}
List<FileDO> lastSnapshotFilelist = new ArrayList<>(16);;
PageResult<FileDO> lastSnapshotFilePage = fileService.getFilePage(new FilePageReqVO() {{
setPageNo(1);
setPageSize(99);
setBusinessId(lastSnapshot.getId());
setBusinessType(BusinesTypeEnum.PROJECT_ORDER_SNAPSHOT.name());
}});
if(lastSnapshotFilePage.getTotal() > 0) {
lastSnapshotFilelist.addAll(lastSnapshotFilePage.getList());
}
if(fileList.size() != lastSnapshotFilelist.size()){
projectOrderDO.getAlterFieldNames().add("attachments");
}else{
boolean allMatch = fileList.stream().allMatch(fileDO -> lastSnapshotFilelist.stream().anyMatch(sFile -> fileDO.getPath().equals(sFile.getPath())));
if(!allMatch){
projectOrderDO.getAlterFieldNames().add("attachments");
}
}
}
}catch (Exception e){
// do nothing
log.error("generate alterFieldNames error, id: {}, exception: {}", id, e.getMessage(), e);
}
return projectOrderDO;
} }
@Override @Override
@ -156,7 +232,31 @@ public class ProjectOrderServiceImpl implements ProjectOrderService {
@Override @Override
public List<ProjectOrderSubDO> getProjectOrderSubListByProjectOrderId(Long projectOrderId) { public List<ProjectOrderSubDO> getProjectOrderSubListByProjectOrderId(Long projectOrderId) {
return projectOrderSubMapper.selectListByProjectOrderId(projectOrderId); List<ProjectOrderSubDO> projectOrderSubDOList = projectOrderSubMapper.selectListByProjectOrderId(projectOrderId);
if(!projectOrderSubDOList.isEmpty()){
// 查询最近归档历史并对比变化字段
try {
ProjectOrderDO lastSnapshot = projectOrderMapper.selectOne(new LambdaQueryWrapper<ProjectOrderDO>() {{
eq(ProjectOrderDO::getSnapshotId, projectOrderId);
orderByDesc(ProjectOrderDO::getId);
last("LIMIT 1");
}});
if(lastSnapshot != null){
List<ProjectOrderSubDO> lastSnapshotSubDOList = projectOrderSubMapper.selectList(ProjectOrderSubDO::getProjectOrderId, lastSnapshot.getId());
Map<String, List<ProjectOrderSubDO>> nameGroups = lastSnapshotSubDOList.stream().collect(Collectors.groupingBy(ProjectOrderSubDO::getName));
projectOrderSubDOList.forEach(projectOrderSubDO -> {
List<ProjectOrderSubDO> lastSnapshotSubs = nameGroups.get(projectOrderSubDO.getName());
if(lastSnapshotSubs.isEmpty()) return;
List<FieldInfo> diffFields = FIELD_EQUATOR.getDiffFields(projectOrderSubDO, lastSnapshotSubs.get(0));
projectOrderSubDO.setAlterFieldNames(diffFields.stream().map(FieldInfo::getFieldName).collect(Collectors.toSet()));
});
}
}catch (Exception e){
log.error("generate sub alterFieldNames error, id: {}, exception: {}", projectOrderId, e.getMessage(), e);
}
}
return projectOrderSubDOList;
} }
@Override @Override

@ -4,6 +4,8 @@ import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FilePageReqVO; import com.chanko.yunxi.mes.module.infra.controller.admin.file.vo.file.FilePageReqVO;
import com.chanko.yunxi.mes.module.infra.dal.dataobject.file.FileDO; import com.chanko.yunxi.mes.module.infra.dal.dataobject.file.FileDO;
import java.util.List;
/** /**
* Service * Service
* *
@ -53,4 +55,10 @@ public interface FileService {
* @param id * @param id
*/ */
void deleteFileLogic(Long id); void deleteFileLogic(Long id);
/**
*
* @param fileDOList
*/
void insertBatch(List<FileDO> fileDOList);
} }

@ -14,6 +14,8 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS; import static com.chanko.yunxi.mes.module.infra.enums.ErrorCodeConstants.FILE_NOT_EXISTS;
@ -101,9 +103,14 @@ public class FileServiceImpl implements FileService {
@Override @Override
public void deleteFileLogic(Long id) { public void deleteFileLogic(Long id) {
// 校验存在 // 校验存在
FileDO file = validateFileExists(id); validateFileExists(id);
// 删除记录 // 删除记录
fileMapper.deleteById(id); fileMapper.deleteById(id);
} }
@Override
public void insertBatch(List<FileDO> fileDOList){
fileMapper.insertBatch(fileDOList);
}
} }

@ -20,6 +20,18 @@
</description> </description>
<dependencies> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>com.chanko.yunxi</groupId> <groupId>com.chanko.yunxi</groupId>
<artifactId>mes-module-system-biz</artifactId> <artifactId>mes-module-system-biz</artifactId>
@ -39,11 +51,6 @@
<artifactId>mes-module-heli-biz</artifactId> <artifactId>mes-module-heli-biz</artifactId>
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<dependency>
<groupId>com.github.dadiyang</groupId>
<artifactId>equator</artifactId>
<version>1.0.4</version>
</dependency>
<!-- 会员中心。默认注释,保证编译速度 --> <!-- 会员中心。默认注释,保证编译速度 -->
<!-- <dependency>--> <!-- <dependency>-->

@ -126,6 +126,7 @@
:disabled="detailDisabled" :disabled="detailDisabled"
v-model="formData.referenceTechnology" v-model="formData.referenceTechnology"
placeholder="请输入可引用的原有技术" placeholder="请输入可引用的原有技术"
:class="{'alter-class': fieldHasAlter('referenceTechnology')}"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -141,6 +142,7 @@
placeholder="请输入检验要求" placeholder="请输入检验要求"
show-word-limit show-word-limit
maxlength="200" maxlength="200"
:class="{'alter-class': fieldHasAlter('referenceTechnology')}"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -197,6 +199,7 @@
<el-form-item label="项目结束日期" prop="projectEndTime"> <el-form-item label="项目结束日期" prop="projectEndTime">
<el-date-picker <el-date-picker
class="!w-250px" class="!w-250px"
:class="{'alter-class': fieldHasAlter('projectEndTime')}"
v-model="formData.projectEndTime" v-model="formData.projectEndTime"
type="date" type="date"
value-format="x" value-format="x"
@ -256,7 +259,9 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="是否有价格" prop="hasPrice"> <el-form-item label="是否有价格" prop="hasPrice">
<el-radio-group v-model="formData.hasPrice" :disabled="detailDisabled"> <el-radio-group v-model="formData.hasPrice" :disabled="detailDisabled"
:class="{'alter-class': fieldHasAlter('hasPrice')}"
>
<el-radio <el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
:key="dict.value" :key="dict.value"
@ -271,7 +276,9 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="是否紧急" prop="isUrgency"> <el-form-item label="是否紧急" prop="isUrgency">
<el-radio-group v-model="formData.isUrgency" :disabled="detailDisabled"> <el-radio-group v-model="formData.isUrgency" :disabled="detailDisabled"
:class="{'alter-class': fieldHasAlter('isUrgency')}"
>
<el-radio <el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
:key="dict.value" :key="dict.value"
@ -308,6 +315,7 @@
v-model="formData.remark" v-model="formData.remark"
show-word-limit show-word-limit
maxlength="200" maxlength="200"
:class="{'alter-class': fieldHasAlter('remark')}"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -357,12 +365,14 @@
:min="0" :min="0"
:precision="6" :precision="6"
style="width: 150px" style="width: 150px"
:class="{'alter-class': fieldHasAlter('price')}"
/> />
<el-select <el-select
:disabled="detailDisabled" :disabled="detailDisabled"
v-model="formData.currency" v-model="formData.currency"
placeholder="请选择币种" placeholder="请选择币种"
style="width: 100px" style="width: 100px"
:class="{'alter-class': fieldHasAlter('currency')}"
> >
<el-option <el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_CURRENCY)" v-for="dict in getStrDictOptions(DICT_TYPE.HELI_CURRENCY)"
@ -380,6 +390,7 @@
<el-form-item label="性质" prop="property"> <el-form-item label="性质" prop="property">
<el-select <el-select
class="!w-250px" class="!w-250px"
:class="{'alter-class': fieldHasAlter('property')}"
:disabled="detailDisabled" :disabled="detailDisabled"
v-model="formData.property" v-model="formData.property"
placeholder="请选择性质" placeholder="请选择性质"
@ -405,7 +416,9 @@
<el-row> <el-row>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="有无合同" prop="hasContract"> <el-form-item label="有无合同" prop="hasContract">
<el-radio-group :disabled="detailDisabled" v-model="formData.hasContract"> <el-radio-group :disabled="detailDisabled" v-model="formData.hasContract"
:class="{'alter-class': fieldHasAlter('hasContract')}"
>
<el-radio <el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
:key="dict.value" :key="dict.value"
@ -418,7 +431,9 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="有无技术协议" prop="hasTechnologyProtocol"> <el-form-item label="有无技术协议" prop="hasTechnologyProtocol">
<el-radio-group :disabled="detailDisabled" v-model="formData.hasTechnologyProtocol"> <el-radio-group :disabled="detailDisabled" v-model="formData.hasTechnologyProtocol"
:class="{'alter-class': fieldHasAlter('hasTechnologyProtocol')}"
>
<el-radio <el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
:key="dict.value" :key="dict.value"
@ -431,7 +446,9 @@
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="有无图纸/数模" prop="hasBlueprint"> <el-form-item label="有无图纸/数模" prop="hasBlueprint">
<el-radio-group :disabled="detailDisabled" v-model="formData.hasBlueprint"> <el-radio-group :disabled="detailDisabled" v-model="formData.hasBlueprint"
:class="{'alter-class': fieldHasAlter('hasBlueprint')}"
>
<el-radio <el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
:key="dict.value" :key="dict.value"
@ -450,6 +467,7 @@
:disabled=" :disabled="
detailDisabled || (formData.hasBlueprint == 0 && (formData.blueprintRemark = '')) detailDisabled || (formData.hasBlueprint == 0 && (formData.blueprintRemark = ''))
" "
:class="{'alter-class': fieldHasAlter('blueprintRemark')}"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -484,7 +502,7 @@
class="mb-0px!" class="mb-0px!"
> >
<el-input <el-input
:disabled="detailDisabled" :disabled="detailDisabled || row.id"
v-model="row.name" v-model="row.name"
placeholder="请输入子项目名称" placeholder="请输入子项目名称"
/> />
@ -499,7 +517,7 @@
class="mb-0px!" class="mb-0px!"
> >
<el-input <el-input
:disabled="detailDisabled" :disabled="detailDisabled || (alterDisabled && row.id)"
v-model="row.deviceModel" v-model="row.deviceModel"
placeholder="请输入设备型号" placeholder="请输入设备型号"
/> />
@ -519,6 +537,7 @@
placeholder="请输入数量" placeholder="请输入数量"
:min="0" :min="0"
:precision="0" :precision="0"
:class="{'alter-class': fieldHasAlterInRow('amount', row)}"
/> />
</el-form-item> </el-form-item>
</template> </template>
@ -534,6 +553,7 @@
:disabled="detailDisabled" :disabled="detailDisabled"
v-model="row.unit" v-model="row.unit"
placeholder="请选择单位" placeholder="请选择单位"
:class="{'alter-class': fieldHasAlterInRow('unit', row)}"
> >
<el-option <el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_PROJECT_ORDER_SUB_UNIT)" v-for="dict in getStrDictOptions(DICT_TYPE.HELI_PROJECT_ORDER_SUB_UNIT)"
@ -563,6 +583,7 @@
filterable filterable
:loading="compositionSelectLoading" :loading="compositionSelectLoading"
:disabled="detailDisabled" :disabled="detailDisabled"
:class="{'alter-class': fieldHasAlterInRow('compositionId', row)}"
> >
<el-option <el-option
v-for="item in compositionSelectList" v-for="item in compositionSelectList"
@ -585,6 +606,7 @@
:disabled="detailDisabled" :disabled="detailDisabled"
v-model="row.remark" v-model="row.remark"
placeholder="请输入备注" placeholder="请输入备注"
:class="{'alter-class': fieldHasAlterInRow('remark', row)}"
/> />
</el-form-item> </el-form-item>
</template> </template>
@ -610,11 +632,15 @@
</el-card> </el-card>
<el-card class="hl-card-info"> <el-card class="hl-card-info">
<template #header> <template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">附件信息</span> <div class="hl-card-info-icona"></div><span class="hl-card-info-text"
>附件信息</span>
</template> </template>
<el-row> <el-row>
<el-col> <el-col>
<el-card class="hl-incard"> <el-card class="hl-incard"
:class="{'alter-class': fieldHasAlter('attachments')}"
>
<el-col v-if="'update,create,alter'.indexOf(query.active) > -1"> <el-col v-if="'update,create,alter'.indexOf(query.active) > -1">
<el-upload <el-upload
ref="contractUploadRef" ref="contractUploadRef"
@ -714,7 +740,7 @@
label="操作时间" label="操作时间"
align="center" align="center"
prop="startTime" prop="startTime"
width="180" width="220"
:formatter="dateFormatter" :formatter="dateFormatter"
/> />
<el-table-column prop="content" label="操作意见" align="center" /> <el-table-column prop="content" label="操作意见" align="center" />
@ -813,7 +839,7 @@ import * as CustomerApi from '@/api/heli/customer/index'
import * as CompositionApi from '@/api/heli/composition/index' import * as CompositionApi from '@/api/heli/composition/index'
import { getAccessToken, getTenantId } from '@/utils/auth' import { getAccessToken, getTenantId } from '@/utils/auth'
import { UploadUserFile } from 'element-plus' import { UploadUserFile } from 'element-plus'
import { deleteFile, downloadFile, getFilePage } from '@/api/infra/file' import { deleteFileLogic, downloadFile, getFilePage } from '@/api/infra/file'
import { propTypes } from '@/utils/propTypes' import { propTypes } from '@/utils/propTypes'
import download from '@/utils/download' import download from '@/utils/download'
import { useUserStore } from '@/store/modules/user' import { useUserStore } from '@/store/modules/user'
@ -869,7 +895,8 @@ const formData = ref({
snapshotId: undefined, snapshotId: undefined,
snapshotCode: undefined, snapshotCode: undefined,
orderTime: new Date(), orderTime: new Date(),
snapshotOrderTime: undefined snapshotOrderTime: undefined,
alterFieldNames: []
}) })
const formRules = reactive({ const formRules = reactive({
businessDeptId: [{ required: true, message: '提出部门不能为空', trigger: 'blur' }], businessDeptId: [{ required: true, message: '提出部门不能为空', trigger: 'blur' }],
@ -898,6 +925,14 @@ const subFormRules = reactive({
status: [{ required: true, message: '状态,1表示正常2表示禁用不能为空', trigger: 'blur' }] status: [{ required: true, message: '状态,1表示正常2表示禁用不能为空', trigger: 'blur' }]
}) })
const fieldHasAlter = (fieldName) => {
return formData.value.alterFieldNames && formData.value.alterFieldNames.indexOf(fieldName) > -1
}
const fieldHasAlterInRow = (fieldName, row) => {
return row.alterFieldNames && row.alterFieldNames.indexOf(fieldName) > -1
}
const deptList = ref<Tree[]>([]) // const deptList = ref<Tree[]>([]) //
const userList = ref<UserApi.UserVO[]>([]) // const userList = ref<UserApi.UserVO[]>([]) //
const userSelectList = ref<UserApi.UserVO[]>([]) const userSelectList = ref<UserApi.UserVO[]>([])
@ -970,28 +1005,29 @@ const queryData = async (type: string, id?: number) => {
if (id) { if (id) {
formData.value = await ProjectOrderApi.getProjectOrder(id) formData.value = await ProjectOrderApi.getProjectOrder(id)
// //
formData.value.projectOrderSubs = formData.value.projectOrderSubs = await ProjectOrderApi.getProjectOrderSubListByProjectOrderId(id)
await ProjectOrderApi.getProjectOrderSubListByProjectOrderId(id)
// //
let businessType = 'PROJECT_ORDER';
if(type == 'detailArchive'){ if(type == 'detailArchive'){
id = formData.value.snapshotId businessType = 'PROJECT_ORDER_SNAPSHOT'
} }else{
// //
let logParams = { let logParams = {
pageNo: 1, pageNo: 1,
pageSize: 99, pageSize: 99,
businessId: id, businessId: id,
businessType: 'PROJECT_ORDER' businessType: businessType
}
formData.value.operateLogs = (await getOperateLogPage(logParams)).list
} }
formData.value.operateLogs = (await getOperateLogPage(logParams)).list
// //
let attParams = { let attParams = {
pageNo: 1, pageNo: 1,
pageSize: 99, pageSize: 99,
businessId: id, businessId: id,
businessType: 'PROJECT_ORDER' businessType: businessType
} }
formData.value.attachments = (await getFilePage(attParams)).list formData.value.attachments = (await getFilePage(attParams)).list
} }
@ -1152,7 +1188,8 @@ const onAddItem = () => {
compositionId: undefined, compositionId: undefined,
unit: undefined, unit: undefined,
remark: undefined, remark: undefined,
status: 1 status: 1,
alterFieldNames: []
} }
row.projectOrderId = formData.value.id row.projectOrderId = formData.value.id
formData.value.projectOrderSubs.push(row) formData.value.projectOrderSubs.push(row)
@ -1189,7 +1226,7 @@ const protocolUploadChange = (file, files) => {
} }
const refreshAttachments = (files, type) => { const refreshAttachments = (files, type) => {
formData.value.attachments = formData.value.attachments.filter((value, index, array) => { formData.value.attachments = formData.value.attachments.filter((value, index, array) => {
return value.businessFileType != type return value.businessFileType != type || value.id
}) })
for (let i = 0; i < files.length; i++) { for (let i = 0; i < files.length; i++) {
let file = files[i] let file = files[i]
@ -1199,7 +1236,7 @@ const refreshAttachments = (files, type) => {
} }
// //
formData.value.attachments.sort((v1, v2) => { formData.value.attachments.sort((v1, v2) => {
return v1.createTime - v2.createTime < 0 return (v1.createTime - v2.createTime) > 0
}) })
} }
@ -1210,7 +1247,7 @@ const handleDeleteAttachment = async (index, type) => {
const attachment = deletedAttachments[i] const attachment = deletedAttachments[i]
if (attachment.id) { if (attachment.id) {
// //
await deleteFile(attachment.id) await deleteFileLogic(attachment.id)
} }
// //
contractUploadFiles.value = contractUploadFiles.value.filter((file1) => { contractUploadFiles.value = contractUploadFiles.value.filter((file1) => {
@ -1271,6 +1308,7 @@ const resetForm = () => {
snapshotCode: undefined, snapshotCode: undefined,
orderTime: new Date(), orderTime: new Date(),
snapshotOrderTime: undefined, snapshotOrderTime: undefined,
alterFieldNames: []
} }
formRef.value?.resetFields() formRef.value?.resetFields()
} }
@ -1302,4 +1340,10 @@ a {
display: inline-block; display: inline-block;
margin-right: 20px; margin-right: 20px;
} }
.hl-card .alter-class {
position: relative;
border: solid 1px orange;
outline: solid 1px orange;
}
</style> </style>

Loading…
Cancel
Save