【需求开发】发货管理 基础功能完善

pull/2/head
zengchenxi 9 months ago
parent 50210fdd14
commit fc5e52ac6c

@ -10,8 +10,8 @@ import lombok.Getter;
@Getter
public enum DeliverOrderStatusEnum {
DEFAULT(1, "已保存"),
FINISHED(2, "已发货");
SAVE(1, "已保存"),
DELIVER(2, "已发货");
private int code;
private String description;

@ -78,7 +78,7 @@ public class DeliverOrderController {
// 手动记录日志
operateLogFrameworkService.createOperateLog(request,
startTime,
BusinesTypeEnum.PROJECT_ORDER.name(),
BusinesTypeEnum.DELIVER_ORDER.name(),
operateReqVO.getId(),
OperateTypeEnum.valueOf(operateReqVO.getActive()).getType(),
operateReqVO.getActiveOpinion());

@ -17,7 +17,6 @@ public class DeliverOrderSaveReqVO {
private Long id;
@Schema(description = "编号,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "编号,唯一不能为空")
private String code;
@Schema(description = "销售订单id列表 多个用英文逗号分割", requiredMode = Schema.RequiredMode.REQUIRED)
@ -49,7 +48,6 @@ public class DeliverOrderSaveReqVO {
private String deliverMode;
@Schema(description = "收货人电话", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "收货人电话不能为空")
private String receivePersonMobile;
@Schema(description = "司机姓名", example = "王五")
@ -75,11 +73,9 @@ public class DeliverOrderSaveReqVO {
private Integer status;
@Schema(description = "收货人姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
@NotEmpty(message = "收货人姓名不能为空")
private String receivePersonName;
@Schema(description = "收货详细地址", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "收货详细地址不能为空")
private String receiveAddress;
@Schema(description = "操作类型")

@ -28,6 +28,9 @@ public class ProjectOrderPageReqVO extends PageParam {
@Schema(description = "发货状态 未发货/部分发货/全部发货", example = "1")
private Integer deliveryStatus;
@Schema(description = "发货状态列表")
private List<Integer> deliveryStatusList;
@Schema(description = "提出部门id", example = "9959")
private Long businessDeptId;

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.DeliverOrderStatusEnum;
import lombok.*;
import java.util.*;
@ -122,6 +123,21 @@ public class DeliverOrderDO extends BaseDO {
private String customerName;
public boolean canDeliver() {
return DeliverOrderStatusEnum.DEFAULT.getCode() == this.deliverStatus.intValue();
return DeliverOrderStatusEnum.SAVE.getCode() == this.deliverStatus.intValue();
}
public boolean canOperate(OperateTypeEnum operateTypeEnum) {
switch (operateTypeEnum){
case SAVE:
return canSave();
case DELIVER:
return canDeliver();
default:
return false;
}
}
private boolean canSave() {
return DeliverOrderStatusEnum.SAVE.getCode() == this.deliverStatus.intValue();
}
}

@ -81,5 +81,13 @@ public class DeliverOrderSubDO extends BaseDO {
*
*/
private Boolean deleted;
/**
* id
*/
private Long saleOrderSubId;
/**
*
*/
private String saleOrderCode;
}

@ -77,4 +77,7 @@ public class ProjectOrderSubDO extends BaseDO {
*/
@TableField(exist = false)
private String compositionName;
@TableField(exist = false)
private String projectOrderCode;
}

@ -34,9 +34,9 @@ public interface DeliverOrderMapper extends BaseMapperX<DeliverOrderDO> {
.orderByDesc(DeliverOrderDO::getId)
.disableSubLogicDel();
query.like(!StringUtils.isEmpty(reqVO.getCode()), DeliverOrderDO::getCode, reqVO.getCode())
.like(!StringUtils.isEmpty(reqVO.getSaleOrderCode()), ProjectOrderDO::getCode, reqVO.getSaleOrderCode())
.like(!StringUtils.isEmpty(reqVO.getCustomerName()), CustomerDO::getName, reqVO.getCustomerName())
.like(!StringUtils.isEmpty(reqVO.getMouldName()), ProjectOrderDO::getMouldName, reqVO.getMouldName())
.like(!StringUtils.isEmpty(reqVO.getSaleOrderCode()), "p.code", reqVO.getSaleOrderCode())
.like(!StringUtils.isEmpty(reqVO.getCustomerName()), "e.name", reqVO.getCustomerName())
.like(!StringUtils.isEmpty(reqVO.getMouldName()), "p.mould_name", reqVO.getMouldName())
.between(reqVO.getDeliverDate() != null && reqVO.getDeliverDate().length == 2,
DeliverOrderDO::getDeliverDate, ArrayUtils.get(reqVO.getDeliverDate(), 0), ArrayUtils.get(reqVO.getDeliverDate(), 1))
.eq(reqVO.getDeliverStatus() != null, DeliverOrderDO::getDeliverStatus, reqVO.getDeliverStatus());

@ -38,6 +38,7 @@ public interface ProjectOrderMapper extends BaseMapperX<ProjectOrderDO> {
.eq(reqVO.getOrderStatus() != null, ProjectOrderDO::getOrderStatus, reqVO.getOrderStatus())
.eq(reqVO.getDeliveryStatus() != null, ProjectOrderDO::getDeliveryStatus, reqVO.getDeliveryStatus())
.in(reqVO.getOrderStatusList() != null && !reqVO.getOrderStatusList().isEmpty(), ProjectOrderDO::getOrderStatus, reqVO.getOrderStatusList())
.in(reqVO.getDeliveryStatusList() != null && !reqVO.getDeliveryStatusList().isEmpty(), ProjectOrderDO::getDeliveryStatus, reqVO.getDeliveryStatusList())
.eq(reqVO.getIsSnapshot() != null, ProjectOrderDO::getIsSnapshot, reqVO.getIsSnapshot())
.eq(reqVO.getHasAlter() != null, ProjectOrderDO::getHasAlter, reqVO.getHasAlter())
.like(!StringUtils.isEmpty(reqVO.getSnapshotCode()), ProjectOrderDO::getSnapshotCode, reqVO.getSnapshotCode());

@ -2,6 +2,7 @@ package com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.composition.CompositionDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper;
@ -19,7 +20,8 @@ public interface ProjectOrderSubMapper extends BaseMapperX<ProjectOrderSubDO> {
default List<ProjectOrderSubDO> selectListByProjectOrderId(Long projectOrderId) {
MPJLambdaWrapper<ProjectOrderSubDO> query = new MPJLambdaWrapper<>();
query.selectAll(ProjectOrderSubDO.class)
.select("b.name as compositionName")
.select("b.name as compositionName", "p.code as projectOrderCode")
.leftJoin(ProjectOrderDO.class, "p", ProjectOrderDO::getId, ProjectOrderSubDO::getProjectOrderId)
.leftJoin(CompositionDO.class, "b", CompositionDO::getId, ProjectOrderSubDO::getCompositionId)
.disableSubLogicDel()
.eq(ProjectOrderSubDO::getProjectOrderId, projectOrderId);

@ -1,29 +1,32 @@
package com.chanko.yunxi.mes.module.heli.service.deliverorder;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.DeliverOrderSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverordersub.DeliverOrderSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder.DeliverOrderMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverordersub.DeliverOrderSubMapper;
import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.DeliverOrderStatusEnum;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverordersub.DeliverOrderSubDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder.DeliverOrderMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.deliverordersub.DeliverOrderSubMapper;
import java.util.Date;
import java.util.List;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PROJECT_DELIVERY_ORDER;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.DELIVER_ORDER_NOT_EXISTS;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.INVALID_OPERATE;
/**
* Service
@ -49,12 +52,15 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
// 月度流水号
SerialNumberDO serialNumberDO = serialNumberService.getSerialNumber(BusinesTypeEnum.DELIVER_ORDER.name(), new SimpleDateFormat("yyyyMM").format(new Date()));
serialNumberDO.setSerialNumber(serialNumberDO.getSerialNumber()+1);
deliverOrder.setCode(PROJECT_DELIVERY_ORDER.getCode(serialNumberDO.getSerialNumber().toString()));
deliverOrder.setDeliverStatus(DeliverOrderStatusEnum.valueOf(createReqVO.getActive()).getCode());
deliverOrderMapper.insert(deliverOrder);
// 插入子表
if(createReqVO.getDeliverOrderSubs() != null && !createReqVO.getDeliverOrderSubs().isEmpty()){
createDeliverOrderSubList(deliverOrder.getId(), createReqVO.getDeliverOrderSubs());
}
createReqVO.setId(deliverOrder.getId()).setCode(deliverOrder.getCode());
// 回写序列记录
serialNumberService.updateSerialNumber(serialNumberDO);
// 返回
@ -66,12 +72,14 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
public void updateDeliverOrder(DeliverOrderSaveReqVO updateReqVO) {
// 校验存在
DeliverOrderDO oldDO = validateDeliverOrderExists(updateReqVO.getId());
if(!oldDO.canDeliver()){
if(!oldDO.canOperate(OperateTypeEnum.valueOf(updateReqVO.getActive()))){
throw exception(INVALID_OPERATE);
}
// 更新
DeliverOrderDO updateObj = BeanUtils.toBean(updateReqVO, DeliverOrderDO.class);
updateObj.setDeliverStatus(DeliverOrderStatusEnum.valueOf(updateReqVO.getActive()).getCode());
deliverOrderMapper.updateById(updateObj);
updateReqVO.setDeliverStatus(updateObj.getDeliverStatus());
// 更新子表
updateDeliverOrderSubList(updateReqVO.getId(), updateReqVO.getDeliverOrderSubs());

@ -21,6 +21,7 @@ export interface DeliverOrderVO {
receivePersonName: string
receiveAddress: string
active: string
deliverOrderSubs: object
}
// 查询发货订单分页

@ -25,7 +25,7 @@
<el-col :span="6">
<el-form-item label="项目编号" prop="saleOrderIds">
<el-input disabled v-model="formData.saleOrderCode" placeholder="请输入项目编号" >
<template #append><el-button @click="openProjectOrderDialog" :icon="Search" /></template>
<template #append><el-button :disabled="query.active != 'create'" @click="openProjectOrderDialog" :icon="Search" /></template>
</el-input>
</el-form-item>
</el-col>
@ -44,6 +44,7 @@
<el-col :span="6">
<el-form-item label="发货日期" prop="deliverDate">
<el-date-picker
:disabled="detailDisabled"
v-model="formData.deliverDate"
type="date"
value-format="x"
@ -58,7 +59,7 @@
</el-col>
<el-col :span="6">
<el-form-item prop="mouldName" label="模具名称">
<el-input v-model="formData.mouldName" />
<el-input disabled v-model="formData.mouldName" />
</el-form-item>
</el-col>
<el-col :span="6">
@ -71,6 +72,7 @@
<el-col :span="12">
<el-form-item label="发货备注" prop="remark">
<el-input
:disabled="detailDisabled"
type="textarea"
v-model="formData.remark"
show-word-limit
@ -87,17 +89,17 @@
<el-row>
<el-col :span="6">
<el-form-item label="发货人姓名" prop="deliverPerson">
<UserSelect v-model="formData.deliverPerson" @update:newValue="handleSelectedUser" />
<UserSelect :disabled="detailDisabled" v-model="formData.deliverPerson" @update:newValue="handleSelectedUser" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="发货人电话" prop="deliverPersonMobile">
<el-input v-model="formData.deliverPersonMobile" />
<el-input :disabled="detailDisabled" v-model="formData.deliverPersonMobile" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="发货方式" prop="deliverMode">
<el-select v-model="formData.deliverMode" placeholder="请选择发货方式">
<el-select :disabled="detailDisabled" v-model="formData.deliverMode" placeholder="请选择发货方式">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_DELIVER_MODE)"
:key="dict.value"
@ -109,33 +111,62 @@
</el-col>
<el-col :span="6">
<el-form-item label="发货单位" prop="deliverCompany">
<el-input value="杭州合立机械有限公司" disabled />
<el-input v-model="formData.deliverCompany" disabled />
</el-form-item>
</el-col>
</el-row>
</el-card>
<el-card class="hl-card-info">
<el-card class="hl-card-info" v-if="formType != 'create'">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">收货信息</span>
</template>
<el-row>
<el-col :span="6">
<el-form-item label="收货人姓名" prop="receivePersonName">
<el-input v-model="formData.receivePersonName" />
<el-select :disabled="detailDisabled" v-model="formData.receivePersonName"
filterable
allow-create
clearable
@change="receiveOnChange"
@blur="e => { if(e.target.value) formData.receivePersonName = e.target.value;}"
>
<el-option
v-for="dict in receivePersonOptions"
:key="dict.name"
:label="dict.name"
:value="dict.name"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="收货人电话" prop="receivePersonMobile">
<el-input v-model="formData.receivePersonMobile" />
<el-input :disabled="detailDisabled" v-model="formData.receivePersonMobile" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="收货详细地址" prop="receiveAddress">
<el-input v-model="formData.receiveAddress" />
<el-select v-model="formData.receiveAddress"
filterable
allow-create
:disabled="detailDisabled"
@blur="e => { if(e.target.value) formData.receiveAddress = e.target.value;}"
clearable
style="width: 100%"
>
<el-option
v-for="dict in receivePersonAddressOptions"
:key="dict.address"
:label="dict.address"
:value="dict.address"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-card>
<el-card class="hl-card-info">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">物流信息</span>
@ -143,34 +174,35 @@
<el-row>
<el-col :span="6">
<el-form-item label="司机姓名" prop="transportDriverName">
<el-input v-model="formData.transportDriverName" />
<el-input :disabled="detailDisabled" v-model="formData.transportDriverName" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="司机电话" prop="transportDriverMobile">
<el-input v-model="formData.transportDriverMobile" />
<el-input :disabled="detailDisabled" v-model="formData.transportDriverMobile" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="车牌号" prop="transportBusNumber">
<el-input v-model="formData.transportBusNumber" />
<el-input :disabled="detailDisabled" v-model="formData.transportBusNumber" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<el-form-item label="重量(T)" prop="transportWeight">
<el-input v-model="formData.transportWeight" />
<el-input :disabled="detailDisabled" v-model="formData.transportWeight" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="位置(米)" prop="transportSize">
<el-input v-model="formData.transportSize" />
<el-input :disabled="detailDisabled" v-model="formData.transportSize" />
</el-form-item>
</el-col>
</el-row>
</el-card>
<el-card class="hl-card-info">
<el-card class="hl-card-info" v-if="formType != 'create'">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">发货清单</span>
</template>
@ -195,10 +227,15 @@
{{scope.row.name}}
</template>
</el-table-column>
<el-table-column label="项目编号" min-width="220" align="center">
<template #default="scope">
{{scope.row.saleOrderCode}}
</template>
</el-table-column>
<el-table-column label="子项目图号" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.blueprintNo`" :rules="subFormRules.blueprintNo" class="mb-0px!">
<el-input v-model="row.blueprintNo" placeholder="请输入子项目图号" />
<el-input :disabled="detailDisabled" v-model="row.blueprintNo" placeholder="请输入子项目图号" />
</el-form-item>
</template>
</el-table-column>
@ -206,11 +243,18 @@
<template #header> <span class="hl-table_header">*</span>本次发货数量 </template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.amount`" :rules="subFormRules.amount" class="mb-0px!">
<el-input v-model="row.amount" placeholder="请输入本次发货数量" />
<el-input-number
:disabled="detailDisabled"
v-model="row.amount"
placeholder="请输入本次发货数量"
style="width: 100%"
:min="1"
:precision="0"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="单位" min-width="150">
<el-table-column label="单位" width="80">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.unit`" :rules="subFormRules.unit" class="mb-0px!">
{{getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT, row.unit)}}
@ -220,27 +264,28 @@
<el-table-column label="重量(T)" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.weight`" class="mb-0px!">
<el-input v-model="row.weight" placeholder="请输入重量(T)" />
<el-input :disabled="detailDisabled" v-model="row.weight" placeholder="请输入重量(T)" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="尺寸(米)" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.size`" class="mb-0px!">
<el-input v-model="row.size" placeholder="请输入尺寸(米)" />
<el-input :disabled="detailDisabled" v-model="row.size" placeholder="请输入尺寸(米)" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="备注" min-width="150">
<el-table-column label="备注" min-width="180">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" class="mb-0px!">
<el-input v-model="row.remark" placeholder="请输入备注" />
<el-input :disabled="detailDisabled" v-model="row.remark" placeholder="请输入备注" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="240">
<el-table-column label="操作" align="center" width="100">
<template #default="scope">
<el-button
v-if="'update,create'.indexOf(query.active) > -1"
link
type="danger"
size="small"
@ -257,12 +302,12 @@
</el-row>
</el-card>
<el-card class="hl-card-info">
<el-card class="hl-card-info" v-if="formType != 'create'">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">其他物料清单</span>
</template>
<el-row>
<el-col>
<el-col v-if="formType != 'detail'">
<el-button class="hl-addbutton" type="primary" size="large" @click="onAddItem2"
>新增</el-button
>
@ -283,14 +328,16 @@
<el-table-column label="序号" type="index" width="100" />
<el-table-column min-width="150" align="center">
<template #header> <span class="hl-table_header">*</span>名称 </template>
<template #default="scope">
{{scope.row.name}}
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.name`" :rules="subFormRules.name" class="mb-0px!">
<el-input :disabled="detailDisabled" v-model="row.name" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="所属类型" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.subType`" :rules="subFormRules.subType" class="mb-0px!">
<el-select v-model="row.subType" placeholder="请选择子项类型">
<el-select :disabled="detailDisabled" v-model="row.subType" placeholder="请选择子项类型">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_DELIVER_MATERIAL_TYPE)"
:key="dict.value"
@ -305,14 +352,21 @@
<template #header> <span class="hl-table_header">*</span>本次发货数量 </template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.amount`" :rules="subFormRules.amount" class="mb-0px!">
<el-input v-model="row.amount" placeholder="请输入本次发货数量" />
<el-input-number
:disabled="detailDisabled"
v-model="row.amount"
placeholder="请输入本次发货数量"
style="width: 100%"
:min="1"
:precision="0"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="单位" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.unit`" :rules="subFormRules.unit" class="mb-0px!">
<el-select v-model="row.unit" placeholder="请选择单位">
<el-select :disabled="detailDisabled" v-model="row.unit" placeholder="请选择单位">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_MATERIAL_UNIT)"
:key="dict.value"
@ -326,13 +380,14 @@
<el-table-column label="备注" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" class="mb-0px!">
<el-input v-model="row.remark" placeholder="请输入备注" />
<el-input :disabled="detailDisabled" v-model="row.remark" placeholder="请输入备注" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="240">
<template #default="scope">
<el-button
v-if="'update,create'.indexOf(query.active) > -1"
link
type="danger"
size="small"
@ -349,12 +404,12 @@
</el-row>
</el-card>
<el-card class="hl-card-info">
<el-card class="hl-card-info" v-if="formType != 'create'">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">附件信息</span>
</template>
<el-row>
<el-col>
<el-col v-if="formType != 'detail'">
<el-upload
ref="attachmentUploadRef"
multiple
@ -384,6 +439,7 @@
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
v-if="'update,create'.indexOf(query.active) > -1"
link
type="danger"
size="small"
@ -407,13 +463,39 @@
</el-col>
</el-row>
</el-card>
<el-card class="hl-card-info" v-if="query.active != 'create'">
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
</template>
<el-row>
<el-col>
<el-card class="hl-incard">
<el-table :data="formData.operateLogs" class="hl-table">
<el-table-column prop="type" label="操作" align="center">
<template #default="scope">
{{ getDictLabel(DICT_TYPE.SYSTEM_OPERATE_TYPE, scope.row.type) }}
</template>
</el-table-column>
<el-table-column prop="userNickname" label="操作人" align="center" />
<el-table-column
label="操作时间"
align="center"
prop="startTime"
:formatter="dateFormatter"
/>
</el-table>
</el-card>
</el-col>
</el-row>
</el-card>
</el-form>
<div class="text-center hl-footer">
<el-button @click="goback" size="large"> </el-button>
<el-button @click="submitForm('SAVE')" type="success" :disabled="formLoading" size="large"
<el-button v-if="formType != 'detail' && formData.deliverStatus == 1" @click="submitForm('SAVE')" type="success" :disabled="formLoading" size="large"
> </el-button
>
<el-button @click="submitForm('DELIVER')" type="primary" :disabled="formLoading" size="large"
<el-button v-if="formType != 'detail' && formData.deliverStatus == 1 && formData.id" @click="submitForm('DELIVER')" type="primary" :disabled="formLoading" size="large"
> </el-button
>
</div>
@ -435,7 +517,8 @@ import {getAccessToken, getTenantId} from "@/utils/auth";
import {dateFormatter} from "@/utils/formatTime";
import download from "@/utils/download";
import { inject } from 'vue'
import {ProjectOrderVO} from "@/api/heli/projectorder";
import {getProjectOrderSubListByProjectOrderId, ProjectOrderVO} from "@/api/heli/projectorder";
import {getCustomer} from "@/api/heli/customer";
const reload = inject('reload')
const { t } = useI18n() //
@ -469,16 +552,15 @@ const formData = ref({
transportWeight: undefined,
transportSize: undefined,
remark: undefined,
status: undefined,
status: 1,
receivePersonName: undefined,
receiveAddress: undefined,
deliverOrderSubs: [],
deliverOrderOtherSubs: [],
attachments: [],
operateLogs: [],
idcard1: undefined,
idcard2: undefined,
active: undefined,
deliverCompany: '杭州合立机械有限公司'
})
const formRules = reactive({
saleOrderIds: [{ required: true, message: '项目编号不能为空', trigger: 'blur' }],
@ -512,16 +594,26 @@ const submitForm = async (active) => {
formData.value.active = active
await formRef.value.validate()
//
try {
if(formType.value != 'create'){
await subFormRef.value.validate()
await otherSubFormRef.value.validate()
} catch (e) {
return
}
//
formLoading.value = true
try {
//
formData.value.deliverOrderSubs?.forEach(item => {
item.category = 'DELIVER_LIST'
item.status = 1
})
formData.value.deliverOrderOtherSubs?.forEach(item => {
item.category = 'OTHER_LIST'
item.status = 1
})
const data = formData.value as unknown as DeliverOrderApi.DeliverOrderVO
if(formData.value.deliverOrderOtherSubs){
data.deliverOrderSubs = data.deliverOrderSubs.concat(formData.value.deliverOrderOtherSubs)
}
const orderId = await DeliverOrderApi.operateDeliverOrder(data)
message.success(t('common.operationSuccess'))
@ -530,15 +622,6 @@ const submitForm = async (active) => {
uploadData.value.businessId = orderId
attachmentUploadRef.value!.submit()
}
//
if(formData.value.idcard1){
let fileParams = {
pageNo: 1,
pageSize: 1,
url: formData.value.idcard1
}
const idcard1FileRet = await getFilePage(fileParams);
}
//
if (active != 'SAVE') {
@ -554,7 +637,6 @@ const submitForm = async (active) => {
}
}
const goback = () => {
resetForm()
router.back()
}
/** 重置表单 */
@ -581,16 +663,15 @@ const resetForm = () => {
transportWeight: undefined,
transportSize: undefined,
remark: undefined,
status: undefined,
status: 1,
receivePersonName: undefined,
receiveAddress: undefined,
deliverOrderSubs: [],
deliverOrderOtherSubs: [],
attachments: [],
operateLogs: [],
idcard1: undefined,
idcard2: undefined,
active: undefined,
deliverCompany: '杭州合立机械有限公司'
}
formRef.value?.resetFields()
}
@ -616,21 +697,15 @@ const onAddItem2 = () => {
//
const handleSelectedUser = (newValue: any) => {
formData.value.deliverPerson = newValue.id
formData.value.deliverPerson = newValue?.id
formData.value.deliverPersonMobile = newValue?.mobile
}
const attachmentUploadRef = ref()
const attachmentUploadFiles = ref<UploadUserFile[]>([])
const idcardBusinessFileType = ref('ID_CARD')
const businessType = ref('DELIVER_ORDER')
const uploadUrl = ref(import.meta.env.VITE_UPLOAD_BATCH_URL)
const idCardUploadData = ref({
businessType: businessType.value,
businessId: formData.value.id,
businessFileType: idcardBusinessFileType.value
})
const uploadData = ref({
businessType: businessType.value,
businessId: formData.value.id
@ -659,6 +734,10 @@ const attachmentUploadChange = (file, files) => {
/** 删除子项操作 */
const onDeleteItem = (index) => {
if(formData.value.deliverOrderSubs.length == 1){
message.warning('发货清单至少存在一条数据')
return
}
formData.value.deliverOrderSubs.splice(index, 1)
}
@ -698,9 +777,27 @@ const queryData = async (type: string, id?: number) => {
try {
if (id) {
formData.value = await DeliverOrderApi.getDeliverOrder(id)
formData.value.deliverCompany = '杭州合立机械有限公司'
//
formData.value.deliverOrderSubs =
await DeliverOrderApi.getDeliverOrderSubListByDeliveryOrderId(id)
const subArr = await DeliverOrderApi.getDeliverOrderSubListByDeliveryOrderId(id)
//
if(!subArr || subArr.length == 0){
formData.value.deliverOrderSubs = [];
let saleOrderIdArr = formData.value.saleOrderIds.split(",");
for (let i = 0; i < saleOrderIdArr.length; i++) {
formData.value.deliverOrderSubs = formData.value.deliverOrderSubs.concat(await getProjectOrderSubListByProjectOrderId(saleOrderIdArr[i]));
formData.value.deliverOrderSubs.forEach(sub => {
sub.remark = ''
sub.saleOrderSubId = sub.id
sub.id = ''
sub.saleOrderCode = sub.projectOrderCode
})
}
}else{
//
formData.value.deliverOrderSubs = subArr.filter(sub => sub.category == 'DELIVER_LIST');
formData.value.deliverOrderOtherSubs = subArr.filter(sub => sub.category == 'OTHER_LIST');
}
//
let logParams = {
@ -718,16 +815,38 @@ const queryData = async (type: string, id?: number) => {
businessId: id,
businessType: businessType.value
}
const fileList = (await getFilePage(attParams)).list
//
if(fileList && fileList.length > 0){
const idcardFiles = fileList.filter((file) => file.businessFileType == idcardBusinessFileType.value);
if(idcardFiles && idcardFiles.length > 0){
formData.value.idcard1 = idcardFiles[0].url;
formData.value.idcard2 = idcardFiles.length > 1 ? idcardFiles[1].url : undefined;
}
formData.value.attachments = fileList.filter((file) => file.businessFileType != idcardBusinessFileType.value);
formData.value.attachments = (await getFilePage(attParams)).list
//
const customer = await getCustomer(formData.value.customerId)
if(customer.contact1Name){
receivePersonOptions.value.push({
"name": customer.contact1Name,
"mobile": customer.contact1Method
})
receivePersonAddressOptions.value.push({
"address": customer.contact1Addr
})
}
if(customer.contact2Name){
receivePersonOptions.value.push({
"name": customer.contact2Name,
"mobile": customer.contact2Method
})
receivePersonAddressOptions.value.push({
"address": customer.contact2Addr
})
}
if(customer.contact3Name){
receivePersonOptions.value.push({
"name": customer.contact3Name,
"mobile": customer.contact3Method
})
receivePersonAddressOptions.value.push({
"address": customer.contact3Addr
})
}
}
} finally {
formLoading.value = false
@ -739,11 +858,47 @@ const openProjectOrderDialog = () => {
projectOrderDialog.value.open()
}
const handleSelectedProjectOrder = (val: ProjectOrderVO[]) => {
console.log(val)
const handleSelectedProjectOrder = (arr: ProjectOrderVO[]) => {
if(arr && arr.length > 0){
let saleOrderIds = "";
let saleOrderCode = "";
let contractNo = "";
let property = "";
let mouldName = "";
for (let i = 0; i < arr.length; i++) {
let order = arr[i];
saleOrderIds += order.id + ",";
saleOrderCode += order.code + ",";
contractNo += order.contractNo + ",";
property += getDictLabel(DICT_TYPE.HELI_PROJECT_PROPERTY, order.property) + ",";
mouldName += order.mouldName + ",";
}
formData.value.saleOrderIds = saleOrderIds.substring(0, saleOrderIds.length-1);
formData.value.saleOrderCode = saleOrderCode.substring(0, saleOrderCode.length-1);
formData.value.contractNo = contractNo.substring(0, contractNo.length-1);
formData.value.property = property.substring(0, property.length-1);
formData.value.mouldName = mouldName.substring(0, mouldName.length-1);
formData.value.customerId = arr[0].customerId;
formData.value.customerName = arr[0].customerName;
}
}
//
const receivePersonOptions = ref([])
//
const receivePersonAddressOptions = ref([])
const receiveOnChange = (val) => {
let matchedPerson = receivePersonOptions.value.find(p => p.name == val);
if(matchedPerson){
formData.value.receivePersonMobile = matchedPerson.mobile
}
}
const detailDisabled = ref(false)
onMounted(() => {
if('detail' == query.active){
detailDisabled.value = true
}
queryData(query.active, query.id)
})
</script>

@ -6,7 +6,7 @@
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
label-width="110px"
>
<el-form-item label="发货单号" prop="code">
<el-input
@ -99,49 +99,54 @@
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column fixed label="序号" type="index" width="100" />
<el-table-column fixed label="发货单号" align="center" prop="code" width="180" />
<el-table-column fixed label="项目编号" align="center" prop="saleOrderCode" width="180" />
<el-table-column fixed label="项目编号" align="center" prop="saleOrderCode" width="220" />
<el-table-column
fixed
label="发货日期"
align="center"
prop="deliverDate"
:formatter="dateFormatter"
:formatter="dateFormatter2"
width="180"
/>
<el-table-column label="客户名称" align="center" prop="customerName" width="180" />
<el-table-column label="客户名称" align="center" prop="customerName" width="220" />
<el-table-column label="合同号" align="center" prop="contractNo" width="180" />
<el-table-column label="模具名称" align="center" prop="mouldName" width="120" />
<el-table-column label="模具名称" align="center" prop="mouldName" width="180" />
<el-table-column label="性质" align="center" prop="property" width="100" />
<el-table-column label="发货人姓名" align="center" prop="deliverPersonName" width="120" />
<el-table-column label="发货人电话" align="center" prop="deliverPersonMobile" width="120" />
<el-table-column label="发货人电话" align="center" prop="deliverPersonMobile" width="160" />
<el-table-column label="收货人姓名" align="center" prop="receivePersonName" width="120" />
<el-table-column label="收货人电话" align="center" prop="receivePersonMobile" width="120" />
<el-table-column label="收货人电话" align="center" prop="receivePersonMobile" width="160" />
<el-table-column label="收货详细地址" align="center" prop="receiveAddress" width="180" />
<el-table-column label="司机姓名" align="center" prop="transportDriverName" width="120" />
<el-table-column label="司机电话" align="center" prop="transportDriverMobile" width="120" />
<el-table-column label="司机电话" align="center" prop="transportDriverMobile" width="160" />
<el-table-column label="发货备注" align="center" prop="remark" width="180" />
<el-table-column fixed="right" label="发货单状态" align="center" prop="deliverStatus" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_DELIVER_ORDER_STATUS" :value="scope.row.deliverStatus" />
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="160">
<el-table-column fixed="right" label="操作" align="center" width="220">
<template #default="scope">
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
>
删除
</el-button>
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['heli:deliver-order:update']"
@click="openDetail('update', scope.row.id)"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['heli:deliver-order:delete']"
type="primary"
@click="openDetail('detail', scope.row.id)"
>
删除
查看详情
</el-button>
</template>
</el-table-column>
@ -159,7 +164,7 @@
<script setup lang="ts">
import {getStrDictOptions, DICT_TYPE, getIntDictOptions} from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import {dateFormatter, dateFormatter2} from '@/utils/formatTime'
import download from '@/utils/download'
import * as DeliverOrderApi from '@/api/heli/deliverorder'

@ -171,8 +171,9 @@ const queryParams = reactive({
pageSize: 10,
contractNo: undefined,
code: undefined,
orderStatus: undefined,
orderStatus: 32,
deliveryStatus: undefined,
deliveryStatusList: [1, 2],
businessDeptId: undefined,
customerName: undefined,
mouldName: undefined,

@ -21,9 +21,9 @@ CREATE TABLE `project_deliver_order` (
`deliver_person` BIGINT(20) not null comment '发货人',
`deliver_person_mobile` varchar(32) not null comment '发货人电话',
`deliver_mode` char(1) not null comment '发货方式',
`receive_person_name` varchar(16) not null comment '收货人姓名',
`receive_person_mobile` varchar(32) not null comment '收货人电话',
`receive_address` varchar(255) not null comment '收货详细地址',
`receive_person_name` varchar(16) comment '收货人姓名',
`receive_person_mobile` varchar(32) comment '收货人电话',
`receive_address` varchar(255) comment '收货详细地址',
`transport_driver_name` varchar(16) comment '司机姓名',
`transport_driver_mobile` varchar(32) comment '司机电话',
`transport_bus_number` varchar(32) comment '车牌号',
@ -45,7 +45,9 @@ DROP TABLE IF EXISTS `project_deliver_order_sub`;
CREATE TABLE `project_deliver_order_sub` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '自增字段,唯一',
`delivery_order_id` bigint(20) NOT NULL COMMENT '订单id',
`category` char(1) not null comment '业务类 发货清单|其他清单 DELIVER_LIST|OTHER_LIST',
`category` varchar(16) not null comment '业务类 发货清单|其他清单 DELIVER_LIST|OTHER_LIST',
`sale_order_sub_id` BIGINT(20) COMMENT '销售订单子项id',
`sale_order_code` varchar(64) COMMENT '销售订单编号',
`name` varchar(128) NOT NULL COMMENT '名称,唯一',
`blueprint_no` varchar(64) DEFAULT NULL COMMENT '图号',
`amount` int(11) NOT NULL COMMENT '数量',
@ -168,4 +170,4 @@ from (
left join `mes-heli`.`base_material` `mat` on((`lg`.`mat_id` = `mat`.`id`)))
where ((`st`.`deleted` = 0) and (`mat`.`deleted` = 0) and (`lg`.`deleted` = 0))
) `t`
group by `t`.`deleted`,`t`.`id`,`t`.`creator`,`t`.`updater`,`t`.`tenant_id`,`t`.`mat_code`,`t`.`mat_name`,`t`.`material_type`,`t`.`spec`,`t`.`unit`,`t`.`wh_id`,`t`.`rg_id`,`t`.`pn_id`,`t`.`short_name`;
group by `t`.`deleted`,`t`.`id`,`t`.`creator`,`t`.`updater`,`t`.`tenant_id`,`t`.`mat_code`,`t`.`mat_name`,`t`.`material_type`,`t`.`spec`,`t`.`unit`,`t`.`wh_id`,`t`.`rg_id`,`t`.`pn_id`,`t`.`short_name`;

Loading…
Cancel
Save