优化销售订单

This commit is contained in:
Mrking 2024-10-29 00:02:36 +08:00
parent 0df79512fb
commit c0cc36772f
15 changed files with 112 additions and 90 deletions

View File

@ -15,8 +15,8 @@ public enum BillStatusEnum {
REJECT("AA", "驳回"),
SAVE("A", "暂存"),
SUBMIT("B", "已提交"),
AUDIT("C", "已审核"),
SUBMIT("B", "待审核"),
AUDIT("C", "待排产"),
INVALID("D", "作废"),
YPLAN("E", "已排产");

View File

@ -138,7 +138,7 @@ public class AppSaleOrderController{
@GetMapping("/get-count")
@Operation(summary = "获得销售订单 分页 tab count")
public CommonResult<Map<Integer, Long>> getSpuCount() {
public CommonResult<Map<String, Long>> getSpuCount() {
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
CustomerDO customer = customerService.getCustomerByUserId(loginUser.getId());
Long customerId = null;

View File

@ -65,13 +65,11 @@ public class AppTradeStatisticsController {
TradeOrderCountRespVO tradeOrderCountRespVO = new TradeOrderCountRespVO();
// 订单统计
Long rejectCount = saleOrderService.getCountByBillStatus(BillStatusEnum.REJECT.getValue(),customerId);
Long saveCount = saleOrderService.getCountByBillStatus(BillStatusEnum.SAVE.getValue(),customerId);
Long submitCount = saleOrderService.getCountByBillStatus(BillStatusEnum.SUBMIT.getValue(),customerId);
Long auditCount = saleOrderService.getCountByBillStatus(BillStatusEnum.AUDIT.getValue(),customerId);
Long count1 = saleOrderService.getCountByBillStatus(BillStatusEnum.SUBMIT.getValue(),customerId);
Long count2 = saleOrderService.getCountByBillStatus(BillStatusEnum.AUDIT.getValue(),customerId);
tradeOrderCountRespVO.setOrderCountAA(rejectCount);
tradeOrderCountRespVO.setOrderCountA(saveCount);
tradeOrderCountRespVO.setOrderCountB(submitCount);
tradeOrderCountRespVO.setOrderCountC(auditCount);
tradeOrderCountRespVO.setOrderCountB(count1);
tradeOrderCountRespVO.setOrderCountC(count2);
// 拼接返回
return success(tradeOrderCountRespVO);
}

View File

@ -132,7 +132,7 @@ public class SaleOrderController {
@GetMapping("/get-count")
@Operation(summary = "获得销售订单 分页 tab count")
@PreAuthorize("@ss.hasPermission('oms:sale-order:query')")
public CommonResult<Map<Integer, Long>> getSpuCount() {
public CommonResult<Map<String, Long>> getSpuCount() {
return success(saleOrderService.getTabsCount(null));
}

View File

@ -46,5 +46,5 @@ public class SaleOrderPageReqVO extends PageParam {
private String remarks;
@Schema(description = "前端请求的tab类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer tabType;
private String tabType;
}

View File

@ -50,11 +50,9 @@ public class TradeStatisticsController {
TradeOrderCountRespVO tradeOrderCountRespVO = new TradeOrderCountRespVO();
// 订单统计
Long rejectCount = saleOrderService.getCountByBillStatus(BillStatusEnum.REJECT.getValue());
Long saveCount = saleOrderService.getCountByBillStatus(BillStatusEnum.SAVE.getValue());
Long submitCount = saleOrderService.getCountByBillStatus(BillStatusEnum.SUBMIT.getValue());
Long auditCount = saleOrderService.getCountByBillStatus(BillStatusEnum.AUDIT.getValue());
tradeOrderCountRespVO.setOrderCountAA(rejectCount);
tradeOrderCountRespVO.setOrderCountA(saveCount);
tradeOrderCountRespVO.setOrderCountB(submitCount);
tradeOrderCountRespVO.setOrderCountC(auditCount);
// 拼接返回

View File

@ -10,13 +10,13 @@ public class TradeOrderCountRespVO {
@Schema(description = "已驳回", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long orderCountAA;
@Schema(description = "待提交", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long orderCountA;
@Schema(description = "待审核", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long orderCountB;
@Schema(description = "已完成", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@Schema(description = "待排产", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long orderCountC;
@Schema(description = "已排产", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long orderCountE;
}

View File

@ -7,6 +7,7 @@ import cn.hangtag.module.oms.controller.admin.saleorder.vo.SaleOrderPageReqVO;
import cn.hangtag.module.oms.controller.admin.trade.vo.TradeOrderSummaryRespVO;
import cn.hangtag.module.oms.controller.admin.trade.vo.TradeOrderTrendRespVO;
import cn.hangtag.module.oms.dal.dataobject.saleorder.SaleOrderDO;
import cn.hangtag.module.oms.enums.common.BillStatusEnum;
import cn.hangtag.module.oms.enums.saleorder.SaleOrderStatusEnum;
import cn.hutool.core.util.ObjectUtil;
import org.apache.ibatis.annotations.Mapper;
@ -24,7 +25,7 @@ import java.util.List;
public interface SaleOrderMapper extends BaseMapperX<SaleOrderDO> {
default PageResult<SaleOrderDO> selectPage(SaleOrderPageReqVO reqVO) {
Integer tabType = reqVO.getTabType();
String tabType = reqVO.getTabType();
LambdaQueryWrapperX<SaleOrderDO> queryWrapper = new LambdaQueryWrapperX<SaleOrderDO>()
.eqIfPresent(SaleOrderDO::getBillno, reqVO.getBillno())
.eqIfPresent(SaleOrderDO::getCustomerId, reqVO.getCustomerId())
@ -49,18 +50,18 @@ public interface SaleOrderMapper extends BaseMapperX<SaleOrderDO> {
* @param tabType 标签类型
* @param query 查询条件
*/
default void appendTabQuery(Integer tabType, LambdaQueryWrapperX<SaleOrderDO> query) {
// 已下单
if (ObjectUtil.equals(SaleOrderStatusEnum.YXD.getValue(), tabType)) {
query.eqIfPresent(SaleOrderDO::getOrderStatus, SaleOrderStatusEnum.YXD.getValue());
default void appendTabQuery(String tabType, LambdaQueryWrapperX<SaleOrderDO> query) {
// 待审核
if (ObjectUtil.equals(BillStatusEnum.SUBMIT.getValue(), tabType)) {
query.eqIfPresent(SaleOrderDO::getBillStatus, BillStatusEnum.SUBMIT.getValue());
}
// 生产中
if (ObjectUtil.equals(SaleOrderStatusEnum.SCZ.getValue(), tabType)) {
query.eqIfPresent(SaleOrderDO::getOrderStatus, SaleOrderStatusEnum.SCZ.getValue());
// 待排产
if (ObjectUtil.equals(BillStatusEnum.AUDIT.getValue(), tabType)) {
query.eqIfPresent(SaleOrderDO::getBillStatus, BillStatusEnum.AUDIT.getValue());
}
// 完成
if (ObjectUtil.equals(SaleOrderStatusEnum.YWC.getValue(), tabType)) {
query.eqIfPresent(SaleOrderDO::getOrderStatus, SaleOrderStatusEnum.YWC.getValue());
// 排产
if (ObjectUtil.equals(BillStatusEnum.YPLAN.getValue(), tabType)) {
query.eqIfPresent(SaleOrderDO::getBillStatus, BillStatusEnum.YPLAN.getValue());
}
}

View File

@ -71,7 +71,7 @@ public interface SaleOrderService {
*/
List<SaleOrderEntryDO> getSaleOrderEntryListByParentId(Long parentId);
Map<Integer, Long> getTabsCount(Long customerId);
Map<String, Long> getTabsCount(Long customerId);
void updateSaleOrderBillStatus(List<Long> ids, String status);
void updateSaleOrderBillStatus(List<Long> ids, String status,Map<String,Object> params);

View File

@ -26,7 +26,6 @@ import cn.hangtag.module.oms.controller.admin.trade.vo.TradeOrderTrendReqVO;
import cn.hangtag.module.oms.controller.admin.trade.vo.TradeOrderTrendRespVO;
import cn.hangtag.module.oms.convert.saleorder.SaleOrderConvert;
import cn.hangtag.module.oms.dal.dataobject.customer.CustomerDO;
import cn.hangtag.module.oms.dal.dataobject.produceorder.ProduceOrderDO;
import cn.hangtag.module.oms.dal.dataobject.product.ProductPriceDO;
import cn.hangtag.module.oms.dal.dataobject.productinfo.ProductInfoDO;
import cn.hangtag.module.oms.dal.dataobject.salecontract.SaleContractDO;
@ -51,20 +50,17 @@ import cn.hangtag.module.oms.service.product.ProductPriceService;
import cn.hangtag.module.oms.service.productinfo.ProductInfoService;
import cn.hangtag.module.oms.service.salecontract.SaleContractService;
import cn.hangtag.module.system.mq.message.mail.MailSendMessage;
import cn.hangtag.module.system.service.mail.MailAccountService;
import cn.hangtag.module.system.service.mail.MailSendService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.google.common.collect.Maps;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
@ -84,7 +80,10 @@ import java.io.InputStream;
import java.math.BigDecimal;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@ -223,35 +222,35 @@ public class SaleOrderServiceImpl implements SaleOrderService {
}
@Override
public Map<Integer, Long> getTabsCount(Long customerId) {
Map<Integer, Long> counts = Maps.newLinkedHashMapWithExpectedSize(3);
public Map<String, Long> getTabsCount(Long customerId) {
Map<String, Long> counts = Maps.newLinkedHashMapWithExpectedSize(3);
LambdaQueryWrapper<SaleOrderDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(SaleOrderDO::getOrderStatus, SaleOrderStatusEnum.YXD.getValue());
lambdaQueryWrapper.eq(SaleOrderDO::getBillStatus, BillStatusEnum.SUBMIT.getValue());
if(customerId!=null){
lambdaQueryWrapper.eq(SaleOrderDO::getCustomerId, customerId);
}
LambdaQueryWrapper<SaleOrderDO> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
lambdaQueryWrapper1.eq(SaleOrderDO::getOrderStatus, SaleOrderStatusEnum.SCZ.getValue());
lambdaQueryWrapper1.eq(SaleOrderDO::getBillStatus, BillStatusEnum.AUDIT.getValue());
if(customerId!=null){
lambdaQueryWrapper1.eq(SaleOrderDO::getCustomerId, customerId);
}
LambdaQueryWrapper<SaleOrderDO> lambdaQueryWrapper2 = new LambdaQueryWrapper<>();
lambdaQueryWrapper2.eq(SaleOrderDO::getOrderStatus, SaleOrderStatusEnum.YWC.getValue());
/* LambdaQueryWrapper<SaleOrderDO> lambdaQueryWrapper2 = new LambdaQueryWrapper<>();
lambdaQueryWrapper2.eq(SaleOrderDO::getOrderStatus, BillStatusEnum.YPLAN.getValue());
if(customerId!=null){
lambdaQueryWrapper2.eq(SaleOrderDO::getCustomerId, customerId);
}
}*/
counts.put("All", 0L);
// 查询已下单订单数量
counts.put(SaleOrderStatusEnum.YXD.getValue(),
counts.put(BillStatusEnum.SUBMIT.getValue(),
saleOrderMapper.selectCount(lambdaQueryWrapper));
// 查询已生产订单数量
counts.put(SaleOrderStatusEnum.SCZ.getValue(),
counts.put(BillStatusEnum.AUDIT.getValue(),
saleOrderMapper.selectCount(lambdaQueryWrapper1));
// 查询已完成订单数量
counts.put(SaleOrderStatusEnum.YWC.getValue(),
saleOrderMapper.selectCount(lambdaQueryWrapper2));
counts.put(BillStatusEnum.YPLAN.getValue(), 0L);
return counts;
}
@Override

View File

@ -10,9 +10,10 @@
COUNT(1) AS orderAmount
FROM oms_saleorder
WHERE deleted = FALSE
<if test="orderStatus != null">
AND order_status = #{orderStatus}
</if>
<!--<if test="billStatus != null">
AND bill_status = #{billStatus}
</if>-->
AND bill_status in ('B','C','E')
<if test="customerId != null">
AND customer_id = #{customerId}
</if>

View File

@ -31,12 +31,12 @@
<!-- 订单状态 -->
<el-descriptions :column="3" title="订单状态">
<el-descriptions-item label="状态: ">
<el-descriptions-item label="单状态: ">
<dict-tag :type="DICT_TYPE.OMS_BILL_STATUS" :value="formData.billStatus" />
</el-descriptions-item>
<el-descriptions-item label="订单状态: ">
<!-- <el-descriptions-item label="订单状态: ">
<dict-tag :type="DICT_TYPE.OMS_ORDER_STATUS" :value="formData.orderStatus" />
</el-descriptions-item>
</el-descriptions-item>-->
<el-descriptions-item v-if="formData.billStatus == 'AA' " label="驳回原因: ">{{ formData?.rejectReason }}</el-descriptions-item>
<el-descriptions-item v-hasPermi="['oms:sale-order:update']" label-class-name="no-colon">
<!-- 待发货 -->

View File

@ -59,10 +59,10 @@
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="billStatus">
<el-form-item label="单状态" prop="billStatus">
<el-select
v-model="queryParams.billStatus"
placeholder="请选择状态"
placeholder="请选择单状态"
clearable
class="!w-240px"
>
@ -74,7 +74,7 @@
/>
</el-select>
</el-form-item>
<el-form-item label="订单状态" prop="orderStatus">
<!-- <el-form-item label="订单状态" prop="orderStatus">
<el-select
v-model="queryParams.orderStatus"
placeholder="请选择订单状态"
@ -88,7 +88,7 @@
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-form-item>-->
<el-form-item label="手机" prop="phone">
<el-input
v-model="queryParams.phone"
@ -123,7 +123,7 @@
>驳回
</el-button>
<el-button
type="primary"
type="danger"
plain
@click="handleUpdateBillStatus('invalid')"
:disabled="selectionList.length === 0"
@ -172,7 +172,7 @@
<el-tab-pane
v-for="item in tabsData"
:key="item.type"
:label="item.name + '(' + item.count + ')'"
:label="(item.type !='All' && item.type !='E') ?item.name + '(' + item.count + ')':item.name"
:name="item.type"
/>
</el-tabs>
@ -186,16 +186,16 @@
<el-table-column label="客户" align="center" prop="customerId" width="120px"/>
<el-table-column label="销售员" align="center" prop="customerId" width="180px"/>
<el-table-column label="跟单员" align="center" prop="customerId" width="180px"/>
<el-table-column label="状态" align="center" prop="billStatus" width="180px">
<el-table-column label="单状态" align="center" prop="billStatus" width="180px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.OMS_BILL_STATUS" :value="scope.row.billStatus" />
</template>
</el-table-column>
<el-table-column label="订单状态" align="center" prop="orderStatus" width="180px">
<!-- <el-table-column label="订单状态" align="center" prop="orderStatus" width="180px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.OMS_ORDER_STATUS" :value="scope.row.orderStatus" />
</template>
</el-table-column>
</el-table-column>-->
<el-table-column
label="业务日期"
align="center"
@ -306,19 +306,24 @@ const total = ref(0) // 列表的总页数
// tabs
const tabsData = ref([
{
name: '全部 ',
type: 'All',
count: 0
},
{
name: '待审核',
type: 0,
type: 'B',
count: 0
},
{
name: '待排产',
type: 1,
type: 'C',
count: 0
},
{
name: '已排产',
type: 2,
type: 'E',
count: 0
}
])
@ -329,7 +334,7 @@ const queryParams = reactive({
pageSize: 10,
billno: undefined,
customerId: undefined,
tabType: 0,
tabType: 'All',
bizdate: [],
confirmdate: [],
plansenddate: [],
@ -366,7 +371,13 @@ const getList = async () => {
const getTabsCount = async () => {
const res = await SaleOrderApi.getTabsCount()
for (let objName in res) {
tabsData.value[Number(objName)].count = res[objName]
let data = tabsData.value
for (let obj in data){
let tabsType = tabsData.value[Number(obj)].type;
if(tabsType == objName){
tabsData.value[Number(obj)].count = res[objName]
}
}
}
}
@ -409,8 +420,8 @@ const handleReject = async () => {
const billStatus = selectionList.value.map((item) => item.billStatus)
debugger
for(let vals of billStatus) {
if(vals!='A' && vals!='B'){
message.error("请选择单据状态保存或已提交的数据行");
if(vals!='B'){
message.error("请选择订单状态待审核的数据行");
return;
}
}

View File

@ -213,5 +213,8 @@ export enum DICT_TYPE {
ERP_STOCK_RECORD_BIZ_TYPE = 'erp_stock_record_biz_type', // 库存明细的业务类型
// ========== OMS - 企业订单管理模块 ==========
OMS_DATA_STATUS = 'oms_data_status' // 数据状态
OMS_DATA_STATUS = 'oms_data_status', // 数据状态
OMS_BILL_STATUS = 'oms_bill_status', // 单据状态
OMS_ORDER_STATUS = 'oms_order_status',// 订单状态
OMS_PRODUCT_CARE_ITEM_TYPE = 'oms_product_care_item_type', //产品保养项目类型 1.成分说明 2.洗涤说明 3.使用说明 4.尺码
}

View File

@ -59,7 +59,7 @@
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="billStatus">
<el-form-item label="单状态" prop="billStatus">
<el-select
v-model="queryParams.billStatus"
placeholder="请选择单据状态"
@ -74,7 +74,7 @@
/>
</el-select>
</el-form-item>
<el-form-item label="订单状态" prop="orderStatus">
<!-- <el-form-item label="订单状态" prop="orderStatus">
<el-select
v-model="queryParams.orderStatus"
placeholder="请选择订单状态"
@ -88,7 +88,7 @@
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-form-item>-->
<el-form-item label="手机" prop="phone">
<el-input
v-model="queryParams.phone"
@ -122,6 +122,7 @@
:disabled="selectionList.length === 0"
>驳回
</el-button>
-->
<el-button
type="primary"
plain
@ -137,6 +138,7 @@
:disabled="selectionList.length === 0"
>提交
</el-button>
<!--
<el-button
type="primary"
plain
@ -171,7 +173,7 @@
<el-tab-pane
v-for="item in tabsData"
:key="item.type"
:label="item.name + '(' + item.count + ')'"
:label="(item.type !='All' && item.type !='E') ?item.name + '(' + item.count + ')':item.name"
:name="item.type"
/>
</el-tabs>
@ -185,16 +187,16 @@
<el-table-column label="客户" align="center" prop="customerId" width="120px"/>
<el-table-column label="销售员" align="center" prop="customerId" width="180px"/>
<el-table-column label="跟单员" align="center" prop="customerId" width="180px"/>
<el-table-column label="状态" align="center" prop="billStatus" width="180px">
<el-table-column label="单状态" align="center" prop="billStatus" width="180px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.OMS_BILL_STATUS" :value="scope.row.billStatus" />
</template>
</el-table-column>
<el-table-column label="订单状态" align="center" prop="orderStatus" width="180px">
<!-- <el-table-column label="订单状态" align="center" prop="orderStatus" width="180px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.OMS_ORDER_STATUS" :value="scope.row.orderStatus" />
</template>
</el-table-column>
</el-table-column>-->
<el-table-column
label="业务日期"
align="center"
@ -235,7 +237,6 @@
<el-table-column label="操作" align="center" width="150" fixed="right">
<template #default="scope">
<el-button
v-hasPermi="['oms:sale-order:query']"
link
type="primary"
@click="openDetail(scope.row.id)"
@ -247,7 +248,6 @@
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['oms:sale-order:delete']"
>
删除
</el-button>
@ -306,18 +306,23 @@ const total = ref(0) // 列表的总页数
// tabs
const tabsData = ref([
{
name: '已下单',
type: 0,
name: '全部 ',
type: 'All',
count: 0
},
{
name: '生产中',
type: 1,
name: '待审核',
type: 'B',
count: 0
},
{
name: '已完成',
type: 2,
name: '待排产',
type: 'C',
count: 0
},
{
name: '已排产',
type: 'E',
count: 0
}
])
@ -328,7 +333,7 @@ const queryParams = reactive({
pageSize: 10,
billno: undefined,
customerId: undefined,
tabType: 0,
tabType: 'All',
bizdate: [],
confirmdate: [],
plansenddate: [],
@ -365,7 +370,13 @@ const getList = async () => {
const getTabsCount = async () => {
const res = await SaleOrderApi.getTabsCount()
for (let objName in res) {
tabsData.value[Number(objName)].count = res[objName]
let data = tabsData.value
for (let obj in data){
let tabsType = tabsData.value[Number(obj)].type;
if(tabsType == objName){
tabsData.value[Number(obj)].count = res[objName]
}
}
}
}
@ -408,8 +419,8 @@ const handleReject = async () => {
const billStatus = selectionList.value.map((item) => item.billStatus)
debugger
for(let vals of billStatus) {
if(vals!='A' && vals!='B'){
message.error("请选择单据状态保存或已提交的数据行");
if(vals!='B'){
message.error("请选择订单状态待审核的数据行");
return;
}
}
@ -424,10 +435,10 @@ const handleUpdateBillStatus = async (operateKey: string) => {
const billStatus = selectionList.value.map((item) => item.billStatus)
for(let vals of billStatus) {
if("audit" == operateKey && vals!='B'){
message.error("请选择单据状态已提交的数据行");
message.error("请选择订单状态待审核的数据行");
return;
}
if("invalid" == operateKey && (vals=='C')){
if("invalid" == operateKey && (vals=='C' || vals=='E')){
debugger
message.error("单据已审核不允许作废");
return;