Commit 17006d2f authored by Administrator's avatar Administrator

Merge branch 'release' into 'jd_dev'

Release最新代码合并入捷道研发分支20241112

See merge request !34
parents 88c68b59 0658f899
-- 补充字典脚本
INSERT INTO `system_dict_type`(`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES ('提货率字段', 'pick_ratio_field', 0, NULL, '119', '2024-09-11 09:06:19', '119', '2024-09-11 09:06:19', b'0');
INSERT INTO `system_dict_data`(`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`) VALUES (0, '等于', 'eqPickRatio', 'pick_ratio_field', 0, 'default', '', NULL, '119', '2024-09-11 09:06:42', '119', '2024-09-11 09:06:42', b'0', '等于');
INSERT INTO `system_dict_data`( `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`) VALUES (0, '大于等于', 'gePickRatio', 'pick_ratio_field', 0, 'default', '', NULL, '119', '2024-09-11 09:06:52', '119', '2024-09-11 09:06:52', b'0', '大于等于');
INSERT INTO `system_dict_data`( `sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`) VALUES (0, '小于等于', 'lePickRatio', 'pick_ratio_field', 0, 'default', '', NULL, '119', '2024-09-11 09:12:15', '119', '2024-09-11 09:12:21', b'0', '小于等于');
INSERT INTO `system_dict_type`(`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES ('提货率匹配字段', 'release_ratio_field', 0, NULL, '119', '2024-09-11 08:59:33', '119', '2024-09-11 08:59:33', b'0');
INSERT INTO `system_dict_data`(`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`) VALUES (0, '大于等于', 'geReleaseRatio', 'release_ratio_field', 0, 'default', '', NULL, '119', '2024-09-11 08:59:58', '119', '2024-09-11 08:59:58', b'0', '大于等于');
INSERT INTO `system_dict_data`(`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`) VALUES (0, '小于等于', 'leReleaseRatio', 'release_ratio_field', 0, 'default', '', NULL, '119', '2024-09-11 09:00:21', '119', '2024-09-11 09:00:21', b'0', '小于等于');
INSERT INTO `system_dict_data`(`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`) VALUES (0, '等于', 'eqReleaseRatio', 'release_ratio_field', 0, 'default', '', NULL, '119', '2024-09-11 09:00:31', '119', '2024-09-11 09:00:31', b'0', '等于');
INSERT INTO `system_dict_type`(`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES ( '提货状态', 'pick_state', 0, NULL, '115', '2024-09-09 21:48:32', '115', '2024-09-09 21:48:32', b'0');
INSERT INTO `system_dict_data`(`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`) VALUES (0, '未提货', '0', 'pick_state', 0, 'default', '', NULL, '115', '2024-09-09 21:49:57', '115', '2024-09-09 21:49:57', b'0', 'not pick');
INSERT INTO `system_dict_data`(`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`) VALUES ( 1, '部分提货', '1', 'pick_state', 0, 'default', '', NULL, '115', '2024-09-09 21:50:40', '115', '2024-09-09 21:50:40', b'0', 'Partial pickup');
INSERT INTO `system_dict_data`(`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`) VALUES (2, '全部提货', '2', 'pick_state', 0, 'default', '', NULL, '115', '2024-09-09 21:51:56', '115', '2024-09-12 11:09:44', b'0', 'Delivered goods');
INSERT INTO `system_dict_type`(`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES ('客户列表数字匹配字段', 'customer_query_number_field', 0, NULL, '115', '2024-09-06 09:47:28', '115', '2024-09-06 09:47:28', b'0');
INSERT INTO `system_dict_data`(`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`) VALUES (0, '等于', 'eqNumberKey', 'customer_query_number_field', 0, 'default', '', NULL, '115', '2024-09-06 09:50:34', '115', '2024-09-06 09:58:10', b'0', 'equal');
INSERT INTO `system_dict_data`(`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`) VALUES (3, '大于等于', 'geNumberKey', 'customer_query_number_field', 0, 'default', '', NULL, '115', '2024-09-06 09:53:11', '115', '2024-09-09 15:44:15', b'0', 'Great than or equal to');
INSERT INTO `system_dict_data`(`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`) VALUES (1, '小于等于', 'leNumberKey', 'customer_query_number_field', 0, 'default', '', NULL, '115', '2024-09-06 09:54:13', '115', '2024-09-06 09:54:33', b'0', 'Less than or equal to');
-- 补充字典脚本
INSERT INTO system_dict_data (`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`) VALUES ( 0, '取消审核', '4', 'audit_status', 0, 'default', '', NULL, '2702', '2024-11-06 22:19:48', '2702', '2024-11-06 22:19:48', b'0', 'Cancel audit');
-- 补充菜单脚本
INSERT INTO `system_menu`( `name`, `permission`, `menu_type`, `sort`, `parent_id`, `path`, `icon`, `component`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `is_show_in_menu_bar`, `name_en`, `keepalive`, `redirect`, `badge_field`) VALUES ('修改状态', 'ecw:customer:followup:batch-update-status', 3, 1, 2378, '', '', '', 0, '2379', '2024-11-10 00:08:01', '2702', '2024-11-10 00:52:36', b'0', b'1', 'Update Status', b'0', NULL, NULL);
package cn.iocoder.yudao.framework.apollo.core.event;
package cn.iocoder.yudao.framework.apollo.core.event.Order;
import cn.iocoder.yudao.framework.common.validation.Marks;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Data
@AllArgsConstructor
public class OrderAssociationOfferInfoEvent {
......
package cn.iocoder.yudao.framework.apollo.core.event;
package cn.iocoder.yudao.framework.apollo.core.event.Order;
import cn.iocoder.yudao.framework.apollo.core.vo.ApplyInfoVO;
import lombok.AllArgsConstructor;
......
package cn.iocoder.yudao.framework.apollo.core.event.box;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Date;
/**
* 强制到仓 Event
*
* @author zhengYi
*/
@Data
@AllArgsConstructor
public class BoxOrderForceWarehouseCheckEvent {
/**
* 订单ID
*/
private Long orderId;
/**
* 自编号
*/
private String selfNo;
/**
* 自编号
*/
private Date unloadTime;
/**
* 运输方式id
*/
private Integer transportId;
}
package cn.iocoder.yudao.framework.apollo.core.event.box;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Date;
/**
* 撤销到仓 Event
*
* @author zhengYi
*/
@Data
@AllArgsConstructor
public class BoxOrderRevokeWarehouseCheckEvent {
/**
* 订单ID
*/
private Long orderId;
}
package cn.iocoder.yudao.module.customer.dal.dataobject.customer;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.customer.vo.customerFollowup.CustomerFollowupBackVO;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* 客户 DO
*
......@@ -522,5 +527,11 @@ public class CustomerDO extends BaseDO {
@TableField(exist = false)
private String competitorNames;
// competitorNames
@ApiModelProperty("最新跟进记录信息")
@TableField(exist = false)
private CustomerFollowupBackVO followupBackVO;
}
......@@ -63,49 +63,8 @@ public interface CustomerMapper extends BaseMapperX<CustomerDO> {
List<CustomerDO> searchCustomer(@Param("reqVO") CustomerSelectReqVO customerSelectReqVO);
@ResultType(CustomerDetailRespVO.class)
@Select({
"<script>",
"select c.*, ",
"cl.name_zh as vip_level_name_zh, cl.name_en as vip_level_name_en, ",
"",
"cc.name_zh as credit_level_name_zh, cc.name_en as credit_level_name_en,",
"",
"country.name_zh as country_name_zh, country.name_en as country_name_en,",
"",
"(SELECT GROUP_CONCAT(title_zh) FROM ecw_product_type pt WHERE FIND_IN_SET(pt.id,(SELECT product_types FROM ecw_customer WHERE id=c.id))) AS product_type_name_zh, ",
"(SELECT GROUP_CONCAT(title_en) FROM ecw_product_type pt WHERE FIND_IN_SET(pt.id,(SELECT product_types FROM ecw_customer WHERE id=c.id))) AS product_type_name_en, ",
"",
"(SELECT GROUP_CONCAT(title_zh) FROM ecw_product p WHERE FIND_IN_SET(p.id,(SELECT product_ids FROM ecw_customer WHERE id=c.id))) AS product_name_zh, ",
"(SELECT GROUP_CONCAT(title_en) FROM ecw_product p WHERE FIND_IN_SET(p.id,(SELECT product_ids FROM ecw_customer WHERE id=c.id))) AS product_name_en, ",
"",
"(SELECT GROUP_CONCAT(title_zh) FROM ecw_node n WHERE FIND_IN_SET(n.id,(SELECT pickup_points FROM ecw_customer WHERE id=c.id))) AS pickup_point_name_zh,",
"(SELECT GROUP_CONCAT(title_en) FROM ecw_node n WHERE FIND_IN_SET(n.id,(SELECT pickup_points FROM ecw_customer WHERE id=c.id))) AS pickup_point_name_en,",
"",
"(SELECT GROUP_CONCAT(name_zh) FROM ecw_country ct WHERE FIND_IN_SET(ct.id,(SELECT busi_country_ids FROM ecw_customer WHERE id=c.id))) AS busi_country_name_zh,",
"(SELECT GROUP_CONCAT(name_en) FROM ecw_country ct WHERE FIND_IN_SET(ct.id,(SELECT busi_country_ids FROM ecw_customer WHERE id=c.id))) AS busi_country_name_en,",
"",
"(SELECT GROUP_CONCAT(name) FROM ecw_customer_competitor ccp WHERE FIND_IN_SET(ccp.id,(SELECT competitor_ids FROM ecw_customer WHERE id=c.id))) AS competitor_names,",
"",
"uc.nickname as creator_name,",
"uu.nickname as updater_name,",
"",
"c.customer_service,",
"u.nickname as customer_service_name",
"",
"from ecw_customer c",
"left join ecw_customer_level cl on c.level = cl.id",
"left join ecw_customer_credit cc on c.credit_level = cc.id",
"left join ecw_country country on c.country = country.id",
"left join system_user u on c.customer_service = u.id",
"left join system_user uc on c.creator = uc.id",
"left join system_user uu on c.updater = uu.id",
"where c.id = #{id}",
"</script>"
})
CustomerDetailRespVO getCustomerDetailRespVO(@Param("id") Long id);
List<CustomerDO> getMyCustomerList(@Param("loginUserId") Long loginUserId);
......
......@@ -34,12 +34,14 @@ import cn.iocoder.yudao.module.customer.convert.customer.CustomerConvert;
import cn.iocoder.yudao.module.customer.convert.customer.line.CustomerLineConvert;
import cn.iocoder.yudao.module.customer.convert.customerBank.CustomerBankConvert;
import cn.iocoder.yudao.module.customer.convert.customerContacts.CustomerContactsConvert;
import cn.iocoder.yudao.module.customer.convert.customerFollowup.CustomerFollowupConvert;
import cn.iocoder.yudao.module.customer.dal.dataobject.customer.CustomerDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customer.line.CustomerLineDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customerAirLog.CustomerAirLogDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customerApproval.CustomerApprovalDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customerBank.CustomerBankDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customerContacts.CustomerContactsDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customerFollowup.CustomerFollowupDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customerPublicCatchLog.CustomerPublicCatchLogDO;
import cn.iocoder.yudao.module.customer.dal.mysql.customer.CustomerLineMapper;
import cn.iocoder.yudao.module.customer.dal.mysql.customer.CustomerMapper;
......@@ -50,6 +52,7 @@ import cn.iocoder.yudao.module.customer.dal.mysql.customerPublicCatchLog.Custome
import cn.iocoder.yudao.module.customer.dto.*;
import cn.iocoder.yudao.module.customer.service.customerApproval.CustomerApprovalService;
import cn.iocoder.yudao.module.customer.service.customerContacts.CustomerContactsService;
import cn.iocoder.yudao.module.customer.service.customerFollowup.CustomerFollowupService;
import cn.iocoder.yudao.module.customer.service.customerOperateLog.CustomerOperateLogService;
import cn.iocoder.yudao.module.customer.vo.customer.customerContacts.CustomerContactsBaseVO;
import cn.iocoder.yudao.module.customer.vo.customer.customerContacts.CustomerContactsCreateReqVO;
......@@ -115,7 +118,6 @@ public class CustomerServiceImpl extends AbstractService<CustomerMapper,
@Resource
private CustomerMapper customerMapper;
@Resource
private ParamValidatorService paramValidatorService;
......@@ -1098,7 +1100,8 @@ public class CustomerServiceImpl extends AbstractService<CustomerMapper,
@Override
public CustomerDetailRespVO getCustomerDetailRespVO(Long id) {
return customerMapper.getCustomerDetailRespVO(id);
CustomerDetailRespVO respVO = customerMapper.getCustomerDetailRespVO(id);
return respVO;
}
@Override
......
......@@ -47,7 +47,13 @@ public interface CustomerCompetitorService extends IService<CustomerCompetitorDO
* @return 客户竞争对手列表
*/
List<CustomerCompetitorDO> getCompetitorList(Collection<Long> ids);
List<CustomerCompetitorDO> getCompetitorList();
/**
* 搜索
* @param searchKey 关键字
* @return
*/
List<CustomerCompetitorDO> getCompetitorListBySearchKey(String searchKey);
/**
* 获得客户竞争对手分页
......
......@@ -2,6 +2,10 @@ package cn.iocoder.yudao.module.customer.service.customerCompetitor;
import java.util.*;
import javax.annotation.Resource;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO;
......@@ -76,8 +80,11 @@ public class CustomerCompetitorServiceImpl extends AbstractService<CustomerCompe
}
@Override
public List<CustomerCompetitorDO> getCompetitorList() {
return competitorMapper.selectList();
public List<CustomerCompetitorDO> getCompetitorListBySearchKey(String searchKey) {
return competitorMapper.selectList(new LambdaQueryWrapper<CustomerCompetitorDO>()
.like(StringUtils.isNotBlank(searchKey), CustomerCompetitorDO::getName, searchKey)
.orderByDesc(CustomerCompetitorDO::getId)
.last("limit 100"));
}
@Override
......
package cn.iocoder.yudao.module.customer.service.customerFollowup;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.apollo.core.event.OrderNumberLogEvent;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderNumberLogEvent;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.code.CodeUtils;
import cn.iocoder.yudao.framework.i18n.core.I18nMessage;
......@@ -31,7 +30,6 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
......@@ -92,30 +90,23 @@ public class CustomerFollowupServiceImpl extends AbstractService<CustomerFollowu
@Override
@Transactional(rollbackFor = Exception.class)
public Long createFollowup(CustomerFollowupCreateReqVO createReqVO) {
// 获取新编号
String newNumber = createReqVO.getNumber();
Long numberId = createReqVO.getNumberId();
Integer numberVersion = createReqVO.getNumberVersion();
// 编号不存在,报异常
if (StringUtils.isBlank(newNumber)) {
throw exception(ErrorCodeConstants.FOLLOWUP_NUMBER_NOT_NULL);
}
// 更新编号,内部会判断冲突
//OrderNumberLogListener
OrderNumberLogEvent event = new OrderNumberLogEvent();
event.setId(numberId);
event.setVersion(numberVersion);
event.setNewNumber(newNumber);
event.setType(6);
event.setType(3);
event.setNumberKey(FOLLOWUP_NEW_NUMBER);
applicationContext.publishEvent(event);
String newNumber = CodeUtils.getOddFollowupNumbers(event.getNumber());
// 更新跟进记录编号最新缓存
// 待将最新单号持久化
event.setNewNumber(newNumber);
applicationContext.publishEvent(event);
// 插入
CustomerFollowupDO followup = CustomerFollowupConvert.INSTANCE.convert(createReqVO);
// 设置联系人名称
setContactName(followup);
followup.setNumber(newNumber);
followupMapper.insert(followup);
Long customerId = createReqVO.getCustomerId();
......@@ -203,31 +194,20 @@ public class CustomerFollowupServiceImpl extends AbstractService<CustomerFollowu
@Override
public void updateFollowupStatus(CustomerFollowupUpdateStatusReqVO updateStatusReqVO) {
Long updateId = updateStatusReqVO.getId();
List<Long> ids = updateStatusReqVO.getIds();
List<Long> idList = new ArrayList<>();
// id + ids 到idList
if (updateId!= null) {
idList.add(updateId);
}
if (CollectionUtil.isNotEmpty(ids)) {
idList.addAll(ids);
}
for (Long id : idList) {
for (Long id : ids) {
CustomerFollowupDO customerFollowupDO = followupMapper.selectById(id);
if (customerFollowupDO == null) {
throw exception(FOLLOWUP_NOT_EXISTS);
}
if (CustomerFollowupStatusEnum.Commited.getValue().equals(customerFollowupDO.getStatus())) {
throw exception(FOLLOWUP_ALREADY_SUBMITTED);
}
//
// if (CustomerFollowupStatusEnum.Commited.getValue().equals(customerFollowupDO.getStatus())) {
// throw exception(FOLLOWUP_ALREADY_SUBMITTED);
// }
}
for (Long id : idList) {
for (Long id : ids) {
CustomerFollowupDO customerFollowupDO = followupMapper.selectById(id);
customerFollowupDO.setStatus(updateStatusReqVO.getStatus());
......@@ -238,7 +218,6 @@ public class CustomerFollowupServiceImpl extends AbstractService<CustomerFollowu
if (customerId != null) {
CustomerDO customer = customerMapper.selectById(customerId);
if (customer != null) {
// 插入日志
LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
//保存客户捞取记录
......
package cn.iocoder.yudao.module.customer.vo.customer.vo;
import cn.iocoder.yudao.module.customer.vo.customerBank.CustomerBankBackVO;
import cn.iocoder.yudao.module.product.vo.product.ProductRespVO;
import cn.iocoder.yudao.module.product.vo.product.ProductTypeRespVO;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......@@ -306,8 +308,11 @@ public class CustomerDetailRespVO extends CustomerBaseVO {
@ApiModelProperty(value = "竞争对手名称")
private String competitorNames;
@ApiModelProperty(value = "选中的主营产品")
private List<ProductRespVO> productList;
@ApiModelProperty(value = "选中的主营产品类型")
private List<ProductTypeRespVO> productTypeList;
@ApiModelProperty(value = "付款人姓名")
private String payerName;
......
package cn.iocoder.yudao.module.customer.vo.customer.vo;
import cn.iocoder.yudao.module.customer.vo.customerFollowup.CustomerFollowupBackVO;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -228,6 +231,15 @@ public class CustomerRespVO extends CustomerBaseVO {
* 产品类型 即主营类别
*/
@ApiModelProperty(value = "主营类别")
private Long productType;
private String productTypes;
/**
* 主营产品 即主营类别下的产品
*/
@ApiModelProperty(value = "主营产品")
private String productIds;
@ApiModelProperty("最新跟进记录信息")
@TableField(exist = false)
private CustomerFollowupBackVO followupBackVO;
}
......@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.customer.vo.customerFollowup;
import cn.iocoder.yudao.framework.excel.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.convert.DictConvert;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.*;
import java.util.*;
import io.swagger.annotations.*;
......@@ -114,6 +115,7 @@ public class CustomerFollowupBackVO {
@ExcelProperty("创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
......
......@@ -14,9 +14,6 @@ import java.util.List;
@ToString(callSuper = true)
public class CustomerFollowupUpdateStatusReqVO {
@ApiModelProperty(value = "主键", required = true)
@NotNull(message = "主键不能为空")
private Long id;
//ids
@ApiModelProperty(value = "主键列表", required = true)
......
......@@ -20,12 +20,14 @@ import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
import cn.iocoder.yudao.module.customer.convert.customer.CustomerConvert;
import cn.iocoder.yudao.module.customer.convert.customerBank.CustomerBankConvert;
import cn.iocoder.yudao.module.customer.convert.customerContacts.CustomerContactsConvert;
import cn.iocoder.yudao.module.customer.convert.customerFollowup.CustomerFollowupConvert;
import cn.iocoder.yudao.module.customer.dal.dataobject.customer.CustomerDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customer.commission.CustomerCommissionDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customer.complaint.CustomerComplaintDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customer.follow.CustomerFollowDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customerBank.CustomerBankDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customerContacts.CustomerContactsDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customerFollowup.CustomerFollowupDO;
import cn.iocoder.yudao.module.customer.dal.mysql.customerDetail.CustomerDetailMapper;
import cn.iocoder.yudao.module.customer.dto.CustomerDelayApprovalInfoDto;
import cn.iocoder.yudao.module.customer.dto.CustomerExportReqDTO;
......@@ -38,6 +40,7 @@ import cn.iocoder.yudao.module.customer.service.customer.complaint.follow.Custom
import cn.iocoder.yudao.module.customer.service.customerBank.CustomerBankService;
import cn.iocoder.yudao.module.customer.service.customerContacts.CustomerContactsService;
import cn.iocoder.yudao.module.customer.service.customerCredit.CustomerCreditService;
import cn.iocoder.yudao.module.customer.service.customerFollowup.CustomerFollowupService;
import cn.iocoder.yudao.module.customer.service.customerLevel.CustomerLevelService;
import cn.iocoder.yudao.module.customer.service.customerLevelLog.CustomerLevelLogServiceImpl;
import cn.iocoder.yudao.module.customer.service.customerOperateLog.CustomerOperateLogService;
......@@ -117,7 +120,8 @@ public class CustomerController {
@Resource
private CustomerService customerService;
@Resource
private CustomerFollowupService customerFollowupService;
@Resource
private CustomerMergeService customerMergeService;
......@@ -383,7 +387,7 @@ public class CustomerController {
if (customerDODeleted == null) {
throw exception(ErrorCodeConstants.CUSTOMER_DELETED_NOT_EXISTS);
}
if (!Objects.equals(customerDOSaved.getCustomerService(), customerDODeleted.getCustomerService())) {
if (!Objects.equals(customerDOSaved.getCustomerService(), customerDODeleted.getCustomerService()) && !customerDOSaved.getIsInOpenSea() && !customerDODeleted.getIsInOpenSea()) {
throw exception(ErrorCodeConstants.CUSTOMER_MERGE_CUSTOMER_SERVICE_NOT_SAME);
}
......@@ -528,7 +532,19 @@ public class CustomerController {
PageResult<CustomerDO> pageResult =
customerService.getWaitToConfirmCustomerPageReq(customerPageReqVO,
page);
return success(CustomerConvert.INSTANCE.convertPage(pageResult));
PageResult<CustomerRespVO> respVOPageResult = CustomerConvert.INSTANCE.convertPage(pageResult);
if (CollectionUtil.isNotEmpty(respVOPageResult.getList())) {
for (CustomerRespVO respVO : respVOPageResult.getList()) {
CustomerFollowupDO customerFollowupDO = customerFollowupService.getOne(new LambdaQueryWrapperX<CustomerFollowupDO>()
.eq(CustomerFollowupDO::getCustomerId, respVO.getId())
.orderByDesc(CustomerFollowupDO::getId)
.last("limit 1"));
if (Objects.nonNull(customerFollowupDO)) {
respVO.setFollowupBackVO(CustomerFollowupConvert.INSTANCE.convert(customerFollowupDO));
}
}
}
return success(respVOPageResult);
}
private Integer getCustomerTime(String customers_to_be_assigned, int i) {
......@@ -552,7 +568,19 @@ public class CustomerController {
//PageResult<CustomerDO> pageResult = customerService.getCustomerPage(pageVO);
PageResult<CustomerDO> pageResult = customerService.getMyCustomerPage(pageVO, page);
return success(CustomerConvert.INSTANCE.convertPage(pageResult));
PageResult<CustomerRespVO> respVOPageResult = CustomerConvert.INSTANCE.convertPage(pageResult);
if (CollectionUtil.isNotEmpty(respVOPageResult.getList())) {
for (CustomerRespVO respVO : respVOPageResult.getList()) {
CustomerFollowupDO customerFollowupDO = customerFollowupService.getOne(new LambdaQueryWrapperX<CustomerFollowupDO>()
.eq(CustomerFollowupDO::getCustomerId, respVO.getId())
.orderByDesc(CustomerFollowupDO::getId)
.last("limit 1"));
if (Objects.nonNull(customerFollowupDO)) {
respVO.setFollowupBackVO(CustomerFollowupConvert.INSTANCE.convert(customerFollowupDO));
}
}
}
return success(respVOPageResult);
}
@GetMapping("/get-wait-for-distribution")
......@@ -562,7 +590,19 @@ public class CustomerController {
//
PageResult<CustomerDO> pageResult =
customerService.getWaitToAssignedCustomerPageReq(customerPageReqVO, page);
return success(CustomerConvert.INSTANCE.convertPage(pageResult));
PageResult<CustomerRespVO> respVOPageResult = CustomerConvert.INSTANCE.convertPage(pageResult);
if (CollectionUtil.isNotEmpty(respVOPageResult.getList())) {
for (CustomerRespVO respVO : respVOPageResult.getList()) {
CustomerFollowupDO customerFollowupDO = customerFollowupService.getOne(new LambdaQueryWrapperX<CustomerFollowupDO>()
.eq(CustomerFollowupDO::getCustomerId, respVO.getId())
.orderByDesc(CustomerFollowupDO::getId)
.last("limit 1"));
if (Objects.nonNull(customerFollowupDO)) {
respVO.setFollowupBackVO(CustomerFollowupConvert.INSTANCE.convert(customerFollowupDO));
}
}
}
return success(respVOPageResult);
}
@GetMapping("/get-public")
......@@ -572,7 +612,19 @@ public class CustomerController {
PageResult<CustomerDO> pageResult =
customerService.getOpenSeaCustomerPageReq(customerPageReqVO, page);
return success(CustomerConvert.INSTANCE.convertPage(pageResult));
PageResult<CustomerRespVO> respVOPageResult = CustomerConvert.INSTANCE.convertPage(pageResult);
if (CollectionUtil.isNotEmpty(respVOPageResult.getList())) {
for (CustomerRespVO respVO : respVOPageResult.getList()) {
CustomerFollowupDO customerFollowupDO = customerFollowupService.getOne(new LambdaQueryWrapperX<CustomerFollowupDO>()
.eq(CustomerFollowupDO::getCustomerId, respVO.getId())
.orderByDesc(CustomerFollowupDO::getId)
.last("limit 1"));
if (Objects.nonNull(customerFollowupDO)) {
respVO.setFollowupBackVO(CustomerFollowupConvert.INSTANCE.convert(customerFollowupDO));
}
}
}
return success(respVOPageResult);
}
@GetMapping("/delay/approval/info")
......@@ -673,7 +725,19 @@ public class CustomerController {
// customerPageReqVO.setFlag4QueryCondition("Y");
PageResult<CustomerDO> pageResult = customerService.getMyCustomerPage(customerPageReqVO, page);
return success(CustomerConvert.INSTANCE.convertPage(pageResult));
PageResult<CustomerRespVO> respVOPageResult = CustomerConvert.INSTANCE.convertPage(pageResult);
if (CollectionUtil.isNotEmpty(respVOPageResult.getList())) {
for (CustomerRespVO respVO : respVOPageResult.getList()) {
CustomerFollowupDO customerFollowupDO = customerFollowupService.getOne(new LambdaQueryWrapperX<CustomerFollowupDO>()
.eq(CustomerFollowupDO::getCustomerId, respVO.getId())
.orderByDesc(CustomerFollowupDO::getId)
.last("limit 1"));
if (Objects.nonNull(customerFollowupDO)) {
respVO.setFollowupBackVO(CustomerFollowupConvert.INSTANCE.convert(customerFollowupDO));
}
}
}
return success(respVOPageResult);
}
@PutMapping("/confirm")
......@@ -752,7 +816,19 @@ public class CustomerController {
//PageResult<CustomerDO> pageResult = customerService.getCustomerPage(pageVO);
PageResult<CustomerDO> pageResult =
customerService.getMyCustomerPage(pageVO, page);
return success(CustomerConvert.INSTANCE.convertPage(pageResult));
PageResult<CustomerRespVO> respVOPageResult = CustomerConvert.INSTANCE.convertPage(pageResult);
if (CollectionUtil.isNotEmpty(respVOPageResult.getList())) {
for (CustomerRespVO respVO : respVOPageResult.getList()) {
CustomerFollowupDO customerFollowupDO = customerFollowupService.getOne(new LambdaQueryWrapperX<CustomerFollowupDO>()
.eq(CustomerFollowupDO::getCustomerId, respVO.getId())
.orderByDesc(CustomerFollowupDO::getId)
.last("limit 1"));
if (Objects.nonNull(customerFollowupDO)) {
respVO.setFollowupBackVO(CustomerFollowupConvert.INSTANCE.convert(customerFollowupDO));
}
}
}
return success(respVOPageResult);
}
@GetMapping("/deptPage")
......
......@@ -55,19 +55,18 @@ public class CustomerCompetitorController {
// return success(true);
// }
//
// @GetMapping("/get")
// @ApiOperation("获得客户竞争对手")
// @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
// @PreAuthorize("@ss.hasPermission('customer:competitor:query')")
// public CommonResult<CustomerCompetitorBackVO> getCompetitor(@RequestParam("id") Long id) {
// CustomerCompetitorDO competitor = competitorService.getCompetitor(id);
// return success(CustomerCompetitorConvert.INSTANCE.convert(competitor));
// }
@GetMapping("/get")
@ApiOperation("获得客户竞争对手")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
public CommonResult<CustomerCompetitorBackVO> getCompetitor(@RequestParam("id") Long id) {
CustomerCompetitorDO competitor = competitorService.getCompetitor(id);
return success(CustomerCompetitorConvert.INSTANCE.convert(competitor));
}
@GetMapping("/list")
@ApiOperation("获得客户竞争对手列表")
@ApiImplicitParam(name = "ids", value = "编号列表", required = true, example = "1024,2048", dataTypeClass = List.class)
// @PreAuthorize("@ss.hasPermission('customer:competitor:query')")
public CommonResult<List<CustomerCompetitorBackVO>> getCompetitorList(@RequestParam("ids") Collection<Long> ids) {
List<CustomerCompetitorDO> list = competitorService.getCompetitorList(ids);
return success(CustomerCompetitorConvert.INSTANCE.convertList(list));
......@@ -75,9 +74,10 @@ public class CustomerCompetitorController {
@GetMapping("/listAll")
@ApiOperation("获得所有客户竞争对手列表")
@ApiImplicitParam(name = "searchKey", value = "关键字", required = false, dataTypeClass = String.class)
// @PreAuthorize("@ss.hasPermission('customer:competitor:query')")
public CommonResult<List<CustomerCompetitorBackVO>> getCompetitorListAll() {
List<CustomerCompetitorDO> list = competitorService.getCompetitorList();
public CommonResult<List<CustomerCompetitorBackVO>> getCompetitorListAll(@RequestParam(value = "searchKey", required = false) String searchKey) {
List<CustomerCompetitorDO> list = competitorService.getCompetitorListBySearchKey(searchKey);
return success(CustomerCompetitorConvert.INSTANCE.convertList(list));
}
......
......@@ -691,4 +691,10 @@ public class OrderDO extends BaseDO {
@TableField(exist = false)
private Boolean isChargeDraft = Boolean.FALSE;
@ApiModelProperty(value = "日志描述信息传值封装字段")
@TableField(exist = false)
private String msg = "";
}
......@@ -105,6 +105,13 @@ public class OrderWarehouseInDO extends BaseDO {
*/
private String remark;
/**
* 出货后新添加的商品
*/
private Boolean isShipmentNewIn = false;
/**
* 入仓纪录明细VO
*/
......
......@@ -431,4 +431,15 @@ public interface ErrorCodeConstants {
ErrorCode ORDER_APPROVAL_IS_NOT_EXISTS = new ErrorCode(1004001171, "order.approval.is.not.exists");
ErrorCode FEE_APPLICATION_NOT_IS_ZERO = new ErrorCode(1004001172, "fee.application.not.is.zero");
ErrorCode GUAN_LIAN_ORDER_IS_APPROVAL_IN_PROCESS = new ErrorCode(1004001173, "guan.lian.order.is.approval.in.process");
//订单不是已装柜/已出货,不可操作
ErrorCode WAREHOUSE_IN_UPDATE_NOT_SHIPMENT = new ErrorCode(1004001181, "warehouse.in.update.not.shipment");
//订单已放货,无法修改
ErrorCode CARGO_CONTROL_ORDER_ALREADY_PICKED = new ErrorCode(1004001182, "cargo.control.order.already.picked");
//订单已提货,无法修改
ErrorCode CARGO_UNCONTROL_ORDER_ALREADY_PICKED = new ErrorCode(1004001183, "cargo.uncontrol.order.already.picked");
}
......@@ -40,6 +40,7 @@ public enum OrderApprovalTypeEnum {
DISCOUNT_APPLY_BATCH(31, "批量优惠申请", Arrays.asList(1, 2, 6, 11, 14, 23, 28, 32)), // 拆单申请/合单申请/订单修改/退仓/撤销拆单审批/优惠申请(当前商品有在途申请)/批量管理折扣申请(当前商品有在途申请)/管理优惠(当前商品有在途申请)
ADMIN_DISCOUNT_BATCH(32, "批量管理折扣申请", Arrays.asList(1, 2, 6, 11, 14, 23, 28, 31)), // 拆单申请/合单申请/订单修改/退仓/撤销拆单审批/优惠申请(当前商品有在途申请)/批量优惠申请(当前商品有在途申请)/管理优惠(当前商品有在途申请)
expense_apply_BATCH(41, "批量费用申请", Arrays.asList(6, 11, 28)), // 拆单申请/合单申请/撤销拆单审批
//分拣
sorting(50, "分拣审批", Arrays.asList(6, 11, 13, 14, 22, 23, 28)), // 自编号全部申请互斥,跟原本一致,不修改, 自编号下订单除拆单申请/合单申请/调仓申请/订单修改/入仓申请/退仓申请外,其他申请不受限制,允许封柜反审批
......
......@@ -153,6 +153,11 @@ public enum OrderApprovalTypeResultEnum implements IntArrayValuable {
admin_discount_batch_reject(32,3, "admin.discount.batch.reject"),
admin_discount_batch_cancel(32,4, "admin.discount.batch.cancel"),
//批量费用申请
expense_apply_batch_processing(41,1, "fee.application.processing"),
expense_apply_batch_pass(41,2, "fee.application.pass"),
expense_apply_batch_reject(41,3, "fee.application.reject"),
expense_apply_batch_cancel(41,4, "fee.application.cancel"),
//分拣
sorting_processing(50,1, "shipment.sorting.processing"),
......
package cn.iocoder.yudao.module.order.listener;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.apollo.core.event.OrderCouponUpdateEvent;
import cn.iocoder.yudao.framework.apollo.core.event.OrderOperateLogEvent;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderCouponUpdateEvent;
import cn.iocoder.yudao.module.order.dal.dataobject.order.OrderDO;
import cn.iocoder.yudao.module.order.enums.OrderStatusEnum;
import cn.iocoder.yudao.module.order.service.order.OrderService;
import cn.iocoder.yudao.module.product.vo.productPrice.ClearancePriceEvent;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.AllArgsConstructor;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionPhase;
......@@ -18,7 +14,6 @@ import org.springframework.transaction.event.TransactionalEventListener;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
* 订单优惠更新监听
......
package cn.iocoder.yudao.module.order.listener;
import cn.iocoder.yudao.framework.apollo.core.event.OrderCustomerServiceEvent;
import cn.iocoder.yudao.framework.apollo.core.event.OrderOperateLogEvent;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderCustomerServiceEvent;
import cn.iocoder.yudao.module.order.dal.mysql.order.OrderMapper;
import cn.iocoder.yudao.module.order.service.order.OrderQueryService;
import cn.iocoder.yudao.module.order.service.order.OrderService;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Objects;
/**
* 查询客户所属订单的客户经理列表
......
package cn.iocoder.yudao.module.order.listener;
import cn.iocoder.yudao.framework.apollo.core.event.OrderNumberLogEvent;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderNumberLogEvent;
import cn.iocoder.yudao.module.order.dal.dataobject.orderNumberLog.OrderNumberLogDO;
import cn.iocoder.yudao.module.order.service.orderNumberLog.OrderNumberLogService;
import lombok.AllArgsConstructor;
......
package cn.iocoder.yudao.module.order.listener;
import cn.iocoder.yudao.framework.apollo.core.event.OrderNumberLogEvent;
import cn.iocoder.yudao.framework.apollo.core.event.OrderOperateLogEvent;
import cn.iocoder.yudao.module.order.dal.dataobject.orderNumberLog.OrderNumberLogDO;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderOperateLogEvent;
import cn.iocoder.yudao.module.order.service.order.OrderBusinessService;
import cn.iocoder.yudao.module.order.service.order.OrderService;
import cn.iocoder.yudao.module.order.service.orderNumberLog.OrderNumberLogService;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.order.enums.ErrorCodeConstants.ORDER_NUMBER_PARAM_NOT_NULL;
/**
* 订单相关操作日志监听
......
package cn.iocoder.yudao.module.order.listener;
import cn.iocoder.yudao.framework.apollo.core.event.OrderNumberLogEvent;
import cn.iocoder.yudao.framework.apollo.core.event.OrderOtherFeeEvent;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderOtherFeeEvent;
import cn.iocoder.yudao.module.order.service.order.OrderService;
import cn.iocoder.yudao.module.product.dto.FeeDto;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.order.enums.ErrorCodeConstants.ORDER_NUMBER_PARAM_NOT_NULL;
/**
* 订单其他费用添加监听器
......
package cn.iocoder.yudao.module.order.listener;
import cn.iocoder.yudao.framework.apollo.core.event.AssignConfirmedCustomerEvent;
import cn.iocoder.yudao.framework.apollo.core.event.ProductConfirmedEvent;
import cn.iocoder.yudao.framework.apollo.core.event.prod.ProductConfirmedEvent;
import cn.iocoder.yudao.module.order.service.orderException.OrderExceptionService;
import lombok.AllArgsConstructor;
import org.springframework.context.event.EventListener;
......
package cn.iocoder.yudao.module.order.listener;
import cn.iocoder.yudao.framework.apollo.core.event.WarehouseInOrderChangeChannelEvent;
import cn.iocoder.yudao.framework.apollo.core.event.warehouseIn.WarehouseInOrderChangeChannelEvent;
import cn.iocoder.yudao.module.order.dal.dataobject.order.OrderDO;
import cn.iocoder.yudao.module.order.service.orderWarehouseIn.OrderWarehouseInService;
import lombok.AllArgsConstructor;
......
package cn.iocoder.yudao.module.order.listener;
import cn.iocoder.yudao.framework.apollo.core.event.WarehouseInOrderChangeTransportEvent;
import cn.iocoder.yudao.framework.apollo.core.event.warehouseIn.WarehouseInOrderChangeTransportEvent;
import cn.iocoder.yudao.module.order.service.orderWarehouseIn.OrderWarehouseInService;
import lombok.AllArgsConstructor;
import org.springframework.context.event.EventListener;
......
......@@ -98,4 +98,6 @@ public interface OrderFeeApplicationService extends IService<OrderFeeApplication
List<OrderFeeApplicationBackVO> getBatchFeeByProcessId(String processId);
void cancelFeeApplication(OrderFeeApplicationUpdateReqVO orderFeeApplicationUpdateReqVO);
OrderFeeApplicationBackVO getApprovalFeeApplication(Long id);
}
......@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.file.FileDO;
import cn.iocoder.yudao.module.order.dal.dataobject.order.OrderDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderItem.OrderItemDO;
import cn.iocoder.yudao.module.order.dto.*;
import cn.iocoder.yudao.module.order.enums.OrderApprovalTypeEnum;
import cn.iocoder.yudao.module.order.vo.approval.OrderApprovalHeadBaseVO;
import cn.iocoder.yudao.module.order.vo.approval.OrderSpecialApplyVO;
import cn.iocoder.yudao.module.order.vo.approval.OrderSpecialBatchApplyVO;
......@@ -37,6 +38,7 @@ public interface OrderQueryService {
* @return 订单
*/
OrderBackVO getOrder(Long orderId);
OrderBackVO getOrderByNo(String orderNo);
OrderBackVO getParentOrder(Long orderId);
......@@ -296,7 +298,7 @@ public interface OrderQueryService {
*
* @param orderId 订单id
*/
void throwProcessingApproval(Long orderId);
void throwProcessingApproval(Long orderId, OrderApprovalTypeEnum approvalTypeEnum);
/**
......
......@@ -5,10 +5,12 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apollo.core.event.*;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderAssociationOfferCostEvent;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderAssociationOfferInfoEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxOrderDynamicEstTimeEvent;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.util.bigDecimal.BigDecimalUtils;
import cn.iocoder.yudao.framework.common.util.code.CodeUtils;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
import cn.iocoder.yudao.framework.i18n.core.I18nMessage;
import cn.iocoder.yudao.framework.mybatis.core.service.AbstractService;
......@@ -45,7 +47,6 @@ import cn.iocoder.yudao.module.order.dal.dataobject.orderNumberLog.OrderNumberLo
import cn.iocoder.yudao.module.order.dal.dataobject.orderObjective.OrderObjectiveDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderSplit.OrderSplitDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderTime.OrderTimeDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderWarehouseCheck.OrderWarehouseCheckDO;
import cn.iocoder.yudao.module.order.dal.mysql.order.OrderMapper;
import cn.iocoder.yudao.module.order.dal.mysql.order.ZTestMapper2;
import cn.iocoder.yudao.module.order.dal.mysql.orderCargoControl.OrderCargoControlMapper;
......@@ -68,7 +69,6 @@ import cn.iocoder.yudao.module.order.vo.orderException.OrderExceptionCreateReqVO
import cn.iocoder.yudao.module.order.vo.orderException.OrderExceptionDescVO;
import cn.iocoder.yudao.module.order.vo.orderItem.OrderItemCheckWarehouseVO;
import cn.iocoder.yudao.module.order.vo.orderOperateLog.OrderOperateLogCreateReqVO;
import cn.iocoder.yudao.module.order.vo.orderWarehouseCheck.CheckItemSumVO;
import cn.iocoder.yudao.module.product.component.ProdCostCalculation;
import cn.iocoder.yudao.module.product.dal.dataobject.product.ProductAttrDO;
import cn.iocoder.yudao.module.product.dal.dataobject.product.ProductDO;
......@@ -89,7 +89,6 @@ import cn.iocoder.yudao.module.wealth.vo.receivable.ReceivableCreateReqVO;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
......@@ -105,7 +104,6 @@ import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.MessageFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.apollo.core.constants.Constants.NOT_ACCEPTED_PROD_CODE;
......
......@@ -6,13 +6,11 @@ import java.util.stream.Stream;
import javax.annotation.Resource;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.apollo.core.event.BoxCheckOrderSchedulingEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrderSchedulingEvent;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.order.convert.order.OrderConvert;
import cn.iocoder.yudao.module.order.dal.dataobject.order.OrderDO;
import cn.iocoder.yudao.module.order.enums.OrderStatusEnum;
import cn.iocoder.yudao.module.order.service.order.OrderBusinessService;
import cn.iocoder.yudao.module.order.service.order.OrderGuanlianService;
import cn.iocoder.yudao.module.order.service.order.OrderQueryService;
......
package cn.iocoder.yudao.module.order.service.order.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.apollo.core.event.OrderOperateLogEvent;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderOperateLogEvent;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.service.AbstractService;
......@@ -16,7 +16,6 @@ import cn.iocoder.yudao.module.order.service.order.OrderLocationService;
import cn.iocoder.yudao.module.order.service.orderWarehouseIn.OrderWarehouseInService;
import cn.iocoder.yudao.module.order.vo.orderLocation.*;
import cn.iocoder.yudao.module.order.vo.orderWarehouseIn.OrderWarehouseInQueryVO;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -24,7 +23,6 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
......
......@@ -5,7 +5,7 @@ import java.util.stream.Collectors;
import javax.annotation.Resource;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.apollo.core.event.BoxCheckOrderSchedulingEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrderSchedulingEvent;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.order.convert.order.OrderConvert;
import cn.iocoder.yudao.module.order.dal.dataobject.order.OrderDO;
......
......@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.order.service.order.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderApprovalTypeCheckEvent;
import cn.iocoder.yudao.framework.common.util.spring.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants;
......@@ -104,6 +105,7 @@ import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeanUtils;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
......@@ -124,6 +126,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
import static cn.iocoder.yudao.framework.excel.constant.ExportConstant.*;
import static cn.iocoder.yudao.module.order.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.order.enums.OrderApprovalTypeEnum.ORDER_UPDATE;
import static cn.iocoder.yudao.module.order.enums.OrderApprovalTypeEnum.merge_order;
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.NOT_FIND_CURRENCY;
/**
......@@ -154,6 +157,7 @@ public class OrderQueryServiceImpl implements OrderQueryService {
private final AdminUserApi adminUserApi;
private final ReceiptService receiptService;
private final CurrencyApi currencyApi;
private final ApplicationContext applicationContext;
private final UserCardAuthService userCardAuthService;
......@@ -161,7 +165,6 @@ public class OrderQueryServiceImpl implements OrderQueryService {
private final OrderWarehousePictureService orderWarehousePictureService;
private final OrderItemPackLogMapper itemPackLogMapper;
private final OrderWarehouseInMapper orderWarehouseInMapper;
......@@ -520,6 +523,72 @@ public class OrderQueryServiceImpl implements OrderQueryService {
return backVO;
}
@Override
public OrderBackVO getOrderByNo(String orderNo) {
OrderDO orderDO = orderMapper.selectOne(new LambdaQueryWrapper<OrderDO>().eq(OrderDO::getOrderNo, orderNo).last("limit 1"));
if (Objects.isNull(orderDO)) {
throw exception(ORDER_NOT_EXISTS);
}
OrderBackVO backVO = OrderConvert.INSTANCE.convert(orderDO);
if (StringUtils.isNotBlank(backVO.getExternalWarehouseJson())) {
backVO.setExternalWarehouseDtoList(JSONObject.parseArray(backVO.getExternalWarehouseJson(), ExternalWarehouseDto.class));
}
// 发货人信息
OrderConsignorDO orderConsignorDO = orderConsignorService.getOne(new LambdaQueryWrapper<OrderConsignorDO>().eq(OrderConsignorDO::getOrderId, orderDO.getOrderId()).orderByDesc(OrderConsignorDO::getId).last("limit 1"));
// if (Objects.isNull(orderConsignorDO)) {
// throw exception(ORDER_CONSIGNOR_NOT_EXISTS);
// }
if (Objects.nonNull(orderConsignorDO)) {
backVO.setConsignorVO(OrderConsignorConvert.INSTANCE.convert(orderConsignorDO));
backVO.setConsignorId(orderConsignorDO.getCustomerId());
backVO.setConsignorContactsId(orderConsignorDO.getCustomerContactsId());
}
// 收货人信息
OrderConsigneeDO orderConsigneeDO = orderConsigneeService.getOne(new LambdaQueryWrapper<OrderConsigneeDO>().eq(OrderConsigneeDO::getOrderId, orderDO.getOrderId()).orderByDesc(OrderConsigneeDO::getId).last("limit 1"));
// if (Objects.isNull(orderConsigneeDO)) {
// throw exception(ORDER_CONSIGNEE_NOT_EXISTS);
// }
if (Objects.nonNull(orderConsigneeDO)) {
backVO.setConsigneeVO(OrderConsigneeConvert.INSTANCE.convert(orderConsigneeDO));
backVO.setConsigneeId(orderConsigneeDO.getCustomerId());
backVO.setConsigneeContactsId(orderConsigneeDO.getCustomerContactsId());
backVO.setConsigneeAddress(orderConsigneeDO.getAddress());
backVO.setHarvestMethod(orderConsigneeDO.getHarvestMethod());
backVO.setCity(orderConsigneeDO.getCity());
backVO.setProvince(orderConsigneeDO.getProvince());
backVO.setCountry(orderConsigneeDO.getCountry());
}
// 始发地
OrderDepartureDO orderDepartureDO = orderDepartureService.getOne(new LambdaQueryWrapper<OrderDepartureDO>().eq(OrderDepartureDO::getOrderId, orderDO.getOrderId()).orderByDesc(OrderDepartureDO::getId).last("limit 1"));
backVO.setOrderDepartureVO(OrderDepartureConvert.INSTANCE.convert(orderDepartureDO));
backVO.setDepartureId(orderDepartureDO.getDepartureId());
// 目的地
OrderObjectiveDO orderObjectiveDO = orderObjectiveService.getOne(new LambdaQueryWrapper<OrderObjectiveDO>().eq(OrderObjectiveDO::getOrderId, orderDO.getOrderId()).orderByDesc(OrderObjectiveDO::getId).last("limit 1"));
backVO.setOrderObjectiveVO(OrderObjectiveConvert.INSTANCE.convert(orderObjectiveDO));
backVO.setObjectiveId(orderObjectiveDO.getObjectiveId());
// 商品信息
List<OrderItemDO> itemDOList = orderItemMapper.selectList(new LambdaQueryWrapper<OrderItemDO>().eq(OrderItemDO::getOrderId, orderDO.getOrderId()).orderByDesc(OrderItemDO::getOrderItemId));
if (CollectionUtil.isNotEmpty(itemDOList)) {
backVO.setOrderItemVOList(OrderItemConvert.INSTANCE.convertList(itemDOList));
}
// 物流信息查询
LogisticsInfoDto logisticsInfoDto = warehouseLineMapper.getStartInfoAndDestInfoByLineId(backVO.getLineId());
if (Objects.isNull(logisticsInfoDto)) {
throw exception(NOT_FIND_LOGISTICS_INFO);
}
logisticsInfoDto.setLineId(backVO.getLineId());
logisticsInfoDto.setTransportId(backVO.getTransportId());
logisticsInfoDto.setChannelId(backVO.getChannelId());
backVO.setLogisticsInfoDto(logisticsInfoDto);
// if (backVO.getOrderNo().startsWith("DRAFT")) {
// backVO.setOrderNo("");
// }
return backVO;
}
@Override
public OrderBackVO getParentOrder(Long orderId) {
// TODO 后面可以在订单列表返回初始母订单id,前端可以直接通过初始母订单id查询订单详情
......@@ -1542,7 +1611,6 @@ public class OrderQueryServiceImpl implements OrderQueryService {
@Override
public void throwPendingExceptionOrProcessingApproval(Long orderId) {
OrderDO orderDO = orderMapper.selectById(orderId);
if (orderDO == null) {
throw exception(ORDER_NOT_EXISTS);
......@@ -1556,16 +1624,18 @@ public class OrderQueryServiceImpl implements OrderQueryService {
}
//判断未处理审核
this.throwProcessingApproval(orderId);
// this.throwProcessingApproval(orderId);
}
@Override
public void throwProcessingApproval(Long orderId) {
public void throwProcessingApproval(Long orderId, OrderApprovalTypeEnum approvalTypeEnum) {
OrderDO orderDO = orderMapper.selectById(orderId);
if (orderDO == null) {
throw exception(ORDER_NOT_EXISTS);
}
if (orderDO.getAuditType() != 0) {
OrderApprovalTypeCheckEvent approvalTypeCheckEvent = new OrderApprovalTypeCheckEvent(orderDO.getOrderId(), null, approvalTypeEnum.getValue(), null, false);
applicationContext.publishEvent(approvalTypeCheckEvent);
if (approvalTypeCheckEvent.getResult()) {
throw exception(ORDER_HAS_PROCESSING_APPROVAL, orderDO.getOrderNo());
}
}
......
......@@ -3,8 +3,8 @@ package cn.iocoder.yudao.module.order.service.orderSplit;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apollo.core.event.BoxCheckOrderSchedulingEvent;
import cn.iocoder.yudao.framework.apollo.core.event.BoxCheckOrdersSchedulingEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrderSchedulingEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrdersSchedulingEvent;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderApprovalTypeCheckEvent;
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
......@@ -55,7 +55,6 @@ import cn.iocoder.yudao.module.order.service.orderWarehouseIn.OrderWarehouseInSe
import cn.iocoder.yudao.module.order.service.orderWarehousePicture.OrderWarehousePictureService;
import cn.iocoder.yudao.module.order.service.targetLog.TargetLogService;
import cn.iocoder.yudao.module.order.vo.approval.OrderApprovalCancelApplyReqVO;
import cn.iocoder.yudao.module.order.vo.approval.OrderSpecialBatchApplyOrderItemDetailVO;
import cn.iocoder.yudao.module.order.vo.order.ApplyInfoVO;
import cn.iocoder.yudao.module.order.vo.order.CostVO;
import cn.iocoder.yudao.module.order.vo.order.OrderBackVO;
......@@ -175,20 +174,23 @@ public class OrderSplitServiceImpl extends AbstractService<OrderSplitMapper, Ord
public Boolean createSplit(OrderSplitCreateReqVO createReqVO) {
String parentOrderNo = createReqVO.getParentOrderNo();
Long parentOrderId = createReqVO.getParentOrderId();
//草稿不可拆单
OrderDO orderDO = orderService.getById(parentOrderId);
if (orderDO == null) {
throw exception(ORDER_NOT_EXISTS);
}
if (OrderStatusEnum.DRAFT.getValue().equals(orderDO.getStatus())) {
throw exception(ORDER_DRAFT_STATUS_NOT_ALLOWED_SPLIT);
}
//该订单是否有待处理异常或待处理审核则抛出异常
orderQueryService.throwPendingExceptionOrProcessingApproval(parentOrderId);
if (orderDO.getAbnormalState() != 0) {
throw exception(ORDER_HAS_PENDING_EXCEPTION, orderDO.getOrderNo());
}
//出货拆单不需要校验
if (createReqVO.isCheckOrderScheduling()) {
applicationContext.publishEvent(new BoxCheckOrderSchedulingEvent(parentOrderId));
}
//草稿不可拆单
OrderDO orderDO = orderService.getById(parentOrderId);
if (OrderStatusEnum.DRAFT.getValue().equals(orderDO.getStatus())) {
throw exception(ORDER_DRAFT_STATUS_NOT_ALLOWED_SPLIT);
}
if (orderDO.getTransportId() == 4 && OrderStatusEnum.IN_WAREHOUSE.getValue().equals(orderDO.getStatus()) && orderDO.getAirShipment() == 2) {
throw exception(AIR_ORDER_IS_CONFIRM_CAN_NOT_SPLIT);
}
......@@ -591,15 +593,17 @@ public class OrderSplitServiceImpl extends AbstractService<OrderSplitMapper, Ord
Long orderId = applyReqVO.getOrderId();
//该订单是否有待处理异常或待处理审核则抛出异常
orderQueryService.throwPendingExceptionOrProcessingApproval(orderId);
//草稿不可拆单
OrderDO orderDO = orderService.getById(orderId);
if (orderDO == null) {
throw exception(ORDER_NOT_EXISTS);
}
if (OrderStatusEnum.DRAFT.getValue().equals(orderDO.getStatus())) {
throw exception(ORDER_DRAFT_STATUS_NOT_ALLOWED_SPLIT);
}
if (orderDO.getAbnormalState() != 0) {
throw exception(ORDER_HAS_PENDING_EXCEPTION, orderDO.getOrderNo());
}
//出货拆单不需要校验
if (applyReqVO.isCheckOrderScheduling()) {
applicationContext.publishEvent(new BoxCheckOrderSchedulingEvent(orderId));
......
package cn.iocoder.yudao.module.order.service.orderWarehouseAdjust;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.apollo.core.event.BoxCheckOrderDestWarehouseEvent;
import cn.iocoder.yudao.framework.apollo.core.event.BoxCheckOrderSchedulingEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrderDestWarehouseEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrderSchedulingEvent;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderApprovalTypeCheckEvent;
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
......@@ -50,7 +50,6 @@ import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.order.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.order.enums.OrderApprovalTypeEnum.ORDER_SPLIT;
import static cn.iocoder.yudao.module.order.enums.OrderApprovalTypeEnum.WAREHOUSE_ADJUST;
/**
......@@ -140,8 +139,12 @@ public class OrderWarehouseAdjustServiceImpl extends AbstractService<OrderWareho
adjustDirectList.add(orderId);
}
}
orderQueryService.throwPendingExceptionOrProcessingApproval(orderId);
if (orderDO == null) {
throw exception(ORDER_NOT_EXISTS);
}
if (orderDO.getAbnormalState() != 0) {
throw exception(ORDER_HAS_PENDING_EXCEPTION, orderDO.getOrderNo());
}
OrderApprovalTypeCheckEvent approvalTypeCheckEvent = new OrderApprovalTypeCheckEvent(orderDO.getOrderId(), null, WAREHOUSE_ADJUST.getValue(), null, false);
applicationContext.publishEvent(approvalTypeCheckEvent);
if (approvalTypeCheckEvent.getResult()) {
......
......@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.order.service.orderWarehouseCheck;
import cn.iocoder.yudao.framework.mybatis.core.service.IService;
import cn.iocoder.yudao.module.order.dal.dataobject.orderWarehouseCheck.OrderWarehouseCheckDO;
import cn.iocoder.yudao.module.order.vo.orderWarehouseCheck.OrderForceCheck;
import cn.iocoder.yudao.module.order.vo.orderWarehouseCheck.OrderWarehouseCheckUpdateItemVO;
import cn.iocoder.yudao.module.order.vo.orderWarehouseCheck.OrderWarehouseCheckUpdateReqVO;
......@@ -30,11 +31,11 @@ public interface OrderWarehouseCheckService extends IService<OrderWarehouseCheck
void check(long orderId);
/**
* 强制到仓. 箱数=入仓箱数
* 强制到仓. 订单修改为已卸柜/到仓 箱数=入仓箱数(注意:这里对/卸柜到仓箱标号不做处理)
*
* @param orderId 订单编号
* @param orderForceCheck 强制到仓信息
*/
void force(long orderId);
void force(OrderForceCheck orderForceCheck);
/**
* 撤销到仓. 修改订单状态为已清关,清空到仓时间箱数以及详情
......
......@@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.order.service.orderWarehouseCheck;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxOrderForceWarehouseCheckEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxOrderRevokeWarehouseCheckEvent;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.yudao.framework.mybatis.core.service.AbstractService;
......@@ -11,6 +13,7 @@ import cn.iocoder.yudao.module.depository.dal.dataobject.warehouse.WarehouseArea
import cn.iocoder.yudao.module.depository.dal.dataobject.warehouse.WarehouseAreaPositionDO;
import cn.iocoder.yudao.module.depository.dal.mysql.warehouse.WarehouseAreaMapper;
import cn.iocoder.yudao.module.depository.dal.mysql.warehouse.WarehouseAreaPositionMapper;
import cn.iocoder.yudao.module.order.dal.dataobject.order.OrderDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderItem.OrderItemDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderWarehouseCheck.OrderWarehouseCheckDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderWarehouseIn.OrderWarehouseInDO;
......@@ -29,6 +32,7 @@ import cn.iocoder.yudao.module.order.vo.orderItem.OrderItemCheckWarehouseVO;
import cn.iocoder.yudao.module.order.vo.orderLocation.OrderLocationBackVO;
import cn.iocoder.yudao.module.order.vo.orderLocation.OrderLocationMergeVO;
import cn.iocoder.yudao.module.order.vo.orderWarehouseCheck.CheckItemSumVO;
import cn.iocoder.yudao.module.order.vo.orderWarehouseCheck.OrderForceCheck;
import cn.iocoder.yudao.module.order.vo.orderWarehouseCheck.OrderWarehouseCheckUpdateItemVO;
import cn.iocoder.yudao.module.order.vo.orderWarehouseCheck.OrderWarehouseCheckUpdateReqVO;
import com.alibaba.fastjson.JSON;
......@@ -41,6 +45,7 @@ import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
......@@ -51,6 +56,8 @@ import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@Slf4j
@Service
@Validated
......@@ -62,7 +69,8 @@ public class OrderWarehouseCheckServiceImpl
@Autowired
private OrderMapper orderMapper;
@Autowired
private ApplicationContext applicationContext;
@Autowired
private OrderWarehouseInService orderWarehouseInService;
@Autowired
......@@ -168,12 +176,22 @@ public class OrderWarehouseCheckServiceImpl
// 清空到仓信息
abstractMapper.delete(wrapper.eq(OrderWarehouseCheckDO::getOrderId, orderId));
// 回退订单到仓状态及数据,并添加日志
orderBusinessService.revokeToWarehouse(orderId);
// 将未实际到仓的订单箱标号卸柜/到仓时间置null
applicationContext.publishEvent(new BoxOrderRevokeWarehouseCheckEvent(orderId));
}
@Override
public void force(long orderId) {
check(orderId);
public void force(OrderForceCheck orderForceCheck) {
// 修改订单卸柜/到仓状态
OrderDO orderDO = orderMapper.selectById(orderForceCheck.getOrderId());
if (Objects.isNull(orderDO)) {
throw exception(ErrorCodeConstants.ORDER_NOT_EXISTS);
}
applicationContext.publishEvent(new BoxOrderForceWarehouseCheckEvent(orderDO.getOrderId(), orderDO.getContainerNumber(), orderForceCheck.getUnloadTime(), orderDO.getTransportId()));
// 同步到仓数据
check(orderForceCheck.getOrderId());
}
@Override
......@@ -196,7 +214,7 @@ public class OrderWarehouseCheckServiceImpl
public void update(OrderWarehouseCheckUpdateReqVO checkUpdateReqVO) {
Map<Long, OrderWarehouseCheckDO> mappings = listByOrderItemId(checkUpdateReqVO.getOrderItemId()).stream()
.collect(Collectors.toMap(OrderWarehouseCheckDO::getId, Function.identity()));
ServiceException exception = ServiceExceptionUtil.exception(ErrorCodeConstants.ORDER_WAREHOUSE_CHECK_NOT_EXISTS);
ServiceException exception = exception(ErrorCodeConstants.ORDER_WAREHOUSE_CHECK_NOT_EXISTS);
List<OrderWarehouseCheckDO> newWarehouseCheckDOList = new ArrayList<>();
Date now = DateUtil.date();
Long userId = SecurityFrameworkUtils.getLoginUserId();
......@@ -275,11 +293,11 @@ public class OrderWarehouseCheckServiceImpl
checkTime = orderWarehouseCheckDOListExist.stream().map(OrderWarehouseCheckDO::getCheckTime).filter(Objects::nonNull).sorted().findFirst().orElse(null);
boxGauge = orderWarehouseCheckDOListExist.stream().map(OrderWarehouseCheckDO::getBoxGauge).filter(Objects::nonNull).sorted().findFirst().orElse(null);
if (StringUtils.isBlank(boxGauge)) {
throw ServiceExceptionUtil.exception(ErrorCodeConstants.BOX_GAUGE_FORMAT_ERROR);
throw exception(ErrorCodeConstants.BOX_GAUGE_FORMAT_ERROR);
}
String[] gauge = boxGauge.split("\\*");
if (gauge.length != 3) {
throw ServiceExceptionUtil.exception(ErrorCodeConstants.BOX_GAUGE_FORMAT_ERROR);
throw exception(ErrorCodeConstants.BOX_GAUGE_FORMAT_ERROR);
}
mixStatus = orderWarehouseCheckDOListExist.stream().anyMatch(t -> CollectionUtil.isNotEmpty(t.getOrderWarehouseInDetailsVOList())) ? 1 : 0;
}
......
......@@ -7,7 +7,6 @@ import cn.iocoder.yudao.module.customer.vo.zhongPao.ZhongPaoBestVO;
import cn.iocoder.yudao.module.order.dal.dataobject.order.OrderDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderItem.OrderItemDO;
import cn.iocoder.yudao.module.order.dal.dataobject.orderWarehouseIn.OrderWarehouseInDO;
import cn.iocoder.yudao.module.order.vo.order.OrderWarehouseInCommonAttrVO;
import cn.iocoder.yudao.module.order.vo.order.OrderWarehouseInWithAttrVO;
import cn.iocoder.yudao.module.order.vo.order.WarehouseInInfoVO;
import cn.iocoder.yudao.module.order.vo.orderItem.OrderItemBackVO;
......@@ -151,6 +150,23 @@ public interface OrderWarehouseInService extends IService<OrderWarehouseInDO> {
String updateOrUpdateApply(@Valid OrderWarehouseInUpdateApplyReqVO updateReqVO);
/**
* 出货阶段-追加申请
*
* @param createReqVO 创建信息
* @return 编号
*/
boolean appendApplyWhenShipment(@Valid OrderWarehouseInCreateReqVO createReqVO);
/**
* 出货阶段-入仓修改申请
* @param updateReqVO
* @return
*/
String updateApplyWhenShipment(@Valid OrderWarehouseInUpdateApplyReqVO updateReqVO);
/**
* 入仓修改回调
*
......
......@@ -92,6 +92,11 @@ public class OrderFeeApplicationBackVO {
@ApiModelProperty(value = "审批流程编号")
private String bpmProcessId;
@ExcelProperty("批量费用审核时业务主键ID")
@ApiModelProperty(value = "批量费用审核时业务主键ID")
private String batchBpmBusinessId;
@ApiModelProperty(value = "始发仓")
private String startWarehouse;
......
package cn.iocoder.yudao.module.order.vo.orderWarehouseCheck;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotNull;
import java.util.Date;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Data
public class OrderForceCheck {
@ApiModelProperty("订单ID")
@NotNull(message = "请选择订单")
private Long orderId ;
@ApiModelProperty("卸柜/到仓时间")
@NotNull(message = "请输入卸柜/到仓时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date unloadTime;
}
package cn.iocoder.yudao.module.order.vo.orderWarehouseIn;
import cn.iocoder.yudao.module.order.vo.order.ApplyInfoVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -112,4 +113,17 @@ public class OrderWarehouseInCreateReqVO {
private Boolean isProcessPicture = true;
// ---------------- 下面属性是给出货阶段 追加入仓申请 使用的 ----------------
@ApiModelProperty(value = "抄送人userId")
private String[] copyUserId;
@ApiModelProperty(value = "修改的信息,返回给前端拼装使用")
private List<ApplyInfoVO> applyInfoVOList;
}
......@@ -8,12 +8,16 @@ import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ApiModel("管理后台 - 入仓货物详情更新 发起请求 Request VO")
@Data
@EqualsAndHashCode
......@@ -109,4 +113,31 @@ public class OrderWarehouseInUpdateApplyReqVO {
@ApiModelProperty(value = "修改的信息,返回给前端拼装使用")
private List<ApplyInfoVO> applyInfoVOList;
// ---------------- 下面属性是给出货阶段 追加入仓申请 使用的 ----------------
@ApiModelProperty(value = "订单项-入仓时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date inTime;
@ApiModelProperty(value = "入仓货物-0下单货物;1非下单货物")
private Integer type = 0;
/**
* 入仓来源 字典order_warehouse_in_source 1-始发港入仓、2-调拨入仓、3-目的港入仓、4-退场入仓 5-拆单后入仓
*/
@ApiModelProperty(value = "入仓来源 字典order_warehouse_in_source 1-始发港入仓、2-调拨入仓、3-目的港入仓、4-退场入仓 5-拆单后入仓")
private Integer source = 1;
// 出货阶段 追加,到仓
private Boolean isShipmentAppend = false;
// 出货阶段 修改
private Boolean isShipmentUpdate = false;
}
......@@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apollo.core.event.OrderAssociationOfferInfoEvent;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderAssociationOfferInfoEvent;
import cn.iocoder.yudao.framework.common.util.spring.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
......@@ -84,7 +84,6 @@ import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
......@@ -363,6 +362,15 @@ public class OrderController {
return success(pageResult);
}
@GetMapping("/customer-statistics-order")
@ApiOperation("客户详情订单统计")
// @PreAuthorize("@ss.hasPermission('ecw:order:query')")
public CommonResult<StatisticsOrderVO> getCustomerStatisticsOrder(OrderQueryVO query, PageVO page) {
query.setUserType(UserTypeEnum.ADMIN.getValue());
StatisticsOrderVO vo = orderQueryService.statisticsMyOrder(query);
return success(vo);
}
@GetMapping("/customer-order-page")
@ApiOperation("客户详情订单分页")
......
......@@ -84,7 +84,7 @@ public class OrderFeeApplicationController {
@PostMapping("/create/batch")
@ApiOperation("批量创建订单费用申请")
@Idempotent(timeout = 5)
@Idempotent(timeout = 10)
public CommonResult<Boolean> createFeeBatchApplication(@Valid @RequestBody OrderFeeBatchApplicationCreateReqVO createReqVO) throws Exception {
String redisKey = MessageFormat.format(ORDER_FEE_APPLICATION_KEY, createReqVO.getOrderId().toString());
Long count = redisHelper.incrBy(redisKey, 1);
......@@ -111,13 +111,14 @@ public class OrderFeeApplicationController {
LambdaQueryWrapper<OrderApprovalDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(OrderApprovalDO::getOrderId, id);
lambdaQueryWrapper.eq(OrderApprovalDO::getStatus, ApprovalResultStatusEnum.processing.getValue());
lambdaQueryWrapper.eq(OrderApprovalDO::getType, 41);
lambdaQueryWrapper.in(OrderApprovalDO::getType, 12, 41);
return success(orderApprovalService.getOne(lambdaQueryWrapper));
}
@PutMapping("/update")
@ApiOperation("更新订单费用申请")
@Idempotent(timeout = 10)
public CommonResult<Boolean> updateFeeApplication(@Valid @RequestBody OrderFeeApplicationUpdateReqVO updateReqVO) {
String redisKey = MessageFormat.format(ORDER_FEE_APPLICATION_KEY, updateReqVO.getOrderId().toString());
......@@ -154,6 +155,14 @@ public class OrderFeeApplicationController {
return success(OrderFeeApplicationConvert.INSTANCE.convert(feeApplication));
}
@GetMapping("/approval/get")
@ApiOperation("获得订单审批费用申请")
@ApiImplicitParam(name = "id", value = "审批id", required = true, example = "1024", dataTypeClass = Long.class)
public CommonResult<OrderFeeApplicationBackVO> getApprovalFeeApplication(@RequestParam("id") Long id) {
OrderFeeApplicationBackVO vo = feeApplicationService.getApprovalFeeApplication(id);
return success(vo);
}
@GetMapping("/getOrderByProcessId")
@ApiOperation("根据流程ID获得订单信息")
@ApiImplicitParam(name = "processId", value = "流程编号", required = true, example = "1024", dataTypeClass = Long.class)
......
......@@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.order.dal.dataobject.orderWarehouseCheck.OrderWar
import cn.iocoder.yudao.module.order.service.order.OrderQueryService;
import cn.iocoder.yudao.module.order.service.orderWarehouseCheck.OrderWarehouseCheckService;
import cn.iocoder.yudao.module.order.vo.order.OrderQueryVO;
import cn.iocoder.yudao.module.order.vo.orderWarehouseCheck.OrderForceCheck;
import cn.iocoder.yudao.module.order.vo.orderWarehouseCheck.OrderWarehouseCheckUpdateReqVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
......@@ -38,11 +39,10 @@ public class OrderWarehouseCheckController {
return success(service.listByOrderItemId(orderItemId));
}
@PostMapping("/force/{orderId}")
@PostMapping("/force")
@ApiOperation("强制到仓")
@ApiImplicitParam(name = "orderId", value = "订单id", required = true, example = "1024", dataTypeClass = Long.class)
public CommonResult<Boolean> force(@PathVariable("orderId") Long orderId) {
service.force(orderId);
public CommonResult<Boolean> force(@Valid @RequestBody OrderForceCheck orderForceCheck) {
service.force(orderForceCheck);
return success(true);
}
......
......@@ -13,7 +13,6 @@ import cn.iocoder.yudao.module.order.service.orderLabel.OrderLabelService;
import cn.iocoder.yudao.module.order.service.orderWarehouseAdjust.OrderWarehouseAdjustService;
import cn.iocoder.yudao.module.order.service.orderWarehouseApproval.OrderWarehouseApprovalService;
import cn.iocoder.yudao.module.order.service.orderWarehouseIn.OrderWarehouseInService;
import cn.iocoder.yudao.module.order.vo.order.OrderWarehouseInCommonAttrVO;
import cn.iocoder.yudao.module.order.vo.order.OrderWarehouseInWithAttrVO;
import cn.iocoder.yudao.module.order.vo.order.WarehouseInInfoVO;
import cn.iocoder.yudao.module.order.vo.orderLabel.OrderLabelBackVO;
......@@ -158,6 +157,33 @@ public class OrderWarehouseInController {
}
/**
* 出货阶段 - 追加
*
* @param createReqVO
* @return
*/
@PostMapping("/append-apply-when-shipment")
@ApiOperation("出货阶段 - 入仓/追加申请")
@Idempotent(timeout = 8)
public CommonResult<Boolean> appendApplyWhenShipment(@Valid @RequestBody OrderWarehouseInCreateReqVO createReqVO) {
return success(orderWarehouseInService.appendApplyWhenShipment(createReqVO));
}
/*
* 出货阶段-入仓修改申请
*/
@PutMapping("/update-apply-when-shipment")
@ApiOperation("出货阶段 - 入仓修改申请")
public CommonResult<Boolean> updateApplyWhenShipment(@Valid @RequestBody OrderWarehouseInUpdateApplyReqVO updateReqVO) {
// 校验存在
String msg = orderWarehouseInService.updateApplyWhenShipment(updateReqVO);
CommonResult<Boolean> success = success(true);
success.setMsg(msg);
return success;
}
@PostMapping("/save-or-update-order-location")
@ApiOperation("新增/更新入仓储位")
@Idempotent(timeout = 5)
......
package cn.iocoder.yudao.module.product.vo.product;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* 商品类型 Base VO,提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class ProductTypeBaseVO {
@ApiModelProperty(value = "中文标题", required = true)
@NotNull(message = "中文标题不能为空")
private String titleZh;
@ApiModelProperty(value = "英文标题", required = true)
@NotNull(message = "英文标题不能为空")
private String titleEn;
@ApiModelProperty(value = "排序", required = true)
@NotNull(message = "排序不能为空")
private Integer sort;
@ApiModelProperty(value = "是否展示 默认为展示")
private Integer status;
}
package cn.iocoder.yudao.module.product.vo.product;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.Date;
@ApiModel("管理后台 - 商品类型 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ProductTypeRespVO extends ProductTypeBaseVO {
@ApiModelProperty(value = "", required = true)
private Long id;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
private Long productNum;
public Long getProductNum() {
if(productNum == null) return 0L;
return productNum;
}
}
......@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.product.service.coupon.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apollo.core.event.OrderCouponUpdateEvent;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderCouponUpdateEvent;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO;
......
......@@ -6,7 +6,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apollo.core.dto.ChannelClearancePriceDto;
import cn.iocoder.yudao.framework.apollo.core.event.ChannelPriceEvent;
import cn.iocoder.yudao.framework.apollo.core.event.ProductLineUpdateAutoProcessOverWeightExceptionEvent;
import cn.iocoder.yudao.framework.apollo.core.event.prod.ProductLineUpdateAutoProcessOverWeightExceptionEvent;
import cn.iocoder.yudao.framework.common.util.spring.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
......
......@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.product.service.product.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.apollo.core.event.ProductConfirmedEvent;
import cn.iocoder.yudao.framework.apollo.core.event.prod.ProductConfirmedEvent;
import cn.iocoder.yudao.framework.common.util.spring.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
......
......@@ -2,23 +2,14 @@ package cn.iocoder.yudao.module.sale.listener;
import cn.iocoder.yudao.framework.apollo.core.event.OfferUpdateOrderNumberEvent;
import cn.iocoder.yudao.framework.apollo.core.event.OrderNumberLogEvent;
import cn.iocoder.yudao.module.order.dal.dataobject.orderNumberLog.OrderNumberLogDO;
import cn.iocoder.yudao.module.order.service.orderNumberLog.OrderNumberLogService;
import cn.iocoder.yudao.module.sale.dal.dataobject.offer.OfferDO;
import cn.iocoder.yudao.module.sale.service.offer.OfferService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.order.enums.ErrorCodeConstants.ORDER_NUMBER_PARAM_NOT_NULL;
/**
* 编号记录监听
......
......@@ -2,15 +2,14 @@ package cn.iocoder.yudao.module.sale.listener;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.apollo.core.event.OrderAssociationOfferCostEvent;
import cn.iocoder.yudao.framework.apollo.core.event.OrderAssociationOfferInfoEvent;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderAssociationOfferCostEvent;
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderAssociationOfferInfoEvent;
import cn.iocoder.yudao.module.product.dto.FeeDto;
import cn.iocoder.yudao.module.product.enums.FeeTypeEnum;
import cn.iocoder.yudao.module.sale.service.offer.OfferService;
import cn.iocoder.yudao.module.sale.vo.offer.EstCostVO;
import cn.iocoder.yudao.module.sale.vo.offer.OfferRespVO;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
......
package cn.iocoder.yudao.module.sale.listener;
import cn.iocoder.yudao.framework.apollo.core.event.ProductLineUpdateAutoProcessOverWeightExceptionEvent;
import cn.iocoder.yudao.framework.apollo.core.event.ProductUpdateAutoProcessOverWeightExceptionEvent;
import cn.iocoder.yudao.framework.apollo.core.event.prod.ProductLineUpdateAutoProcessOverWeightExceptionEvent;
import cn.iocoder.yudao.framework.apollo.core.event.prod.ProductUpdateAutoProcessOverWeightExceptionEvent;
import cn.iocoder.yudao.module.order.service.orderException.OrderExceptionService;
import lombok.AllArgsConstructor;
import org.springframework.context.event.EventListener;
......
......@@ -188,4 +188,13 @@ public interface OfferService extends IService<OfferDO> {
* @param result 处理结果说明
*/
void addOfferLog(Long offerId, String number, Long customerId, Integer followUpMethod, String userId, String result);
/**
* 跟进客户查询其关联的报价单
*
* @param customerId 客户id
* @param searchKey 关键字搜索
* @return
*/
List<OfferRespVO> getCustomerOfferSelect(Long customerId, String searchKey);
}
......@@ -646,6 +646,7 @@ public class OfferServiceImpl extends AbstractService<OfferMapper, OfferDO> impl
if (Objects.isNull(offerDO)) {
throw exception(OFFER_NOT_EXISTS);
}
OfferRespVO respVO = OfferConvert.INSTANCE.convert(offerDO);
EstCostVO estCostVO = JSONObject.parseObject(offerDO.getEstCost(), EstCostVO.class);
if (Objects.nonNull(estCostVO)) {
......@@ -672,6 +673,13 @@ public class OfferServiceImpl extends AbstractService<OfferMapper, OfferDO> impl
warehouseLineMapper.getStartInfoAndDestInfoByLineId(
respVO.getLineId());
respVO.setLogisticsInfoDto(logisticsInfoDto);
// 客户编号
if (Objects.nonNull(respVO.getRelationId())) {
CustomerDO customerDO = customerService.getById(respVO.getRelationId());
if (Objects.nonNull(customerDO)) {
respVO.setCustomerNumber(customerDO.getNumber());
}
}
return respVO;
}
......@@ -919,12 +927,12 @@ public class OfferServiceImpl extends AbstractService<OfferMapper, OfferDO> impl
}
// 查询该订单是否有绑定报价单
OfferDO offer = offerMapper.selectOne(new LambdaQueryWrapper<OfferDO>().eq(OfferDO::getOfferId, orderDO.getOrderId()).last("limit 1"));
if (Objects.nonNull(offer)){
if (Objects.nonNull(offer)) {
throw exception(ORDER_BOUND_OFFER);
}
//如果订单关联上报价单
if(orderDO!=null && offerDO.getOfferId()!=null){
this.checkOrderSalesman(orderDO,offerDO.getOfferId()) ;
if (orderDO != null && offerDO.getOfferId() != null) {
this.checkOrderSalesman(orderDO, offerDO.getOfferId());
}
} else {
......@@ -952,12 +960,13 @@ public class OfferServiceImpl extends AbstractService<OfferMapper, OfferDO> impl
/**
* 赢单处理报价单时,再次判断业绩归属
*
* @param orderDO
* @param offerId
*/
private void checkOrderSalesman(OrderDO orderDO, Long offerId) {
orderService.checkOrderSalesman(orderDO,offerId,null,null,null,null);
orderService.updateOrderCustomerAndSalesmanId(orderDO.getCustomerId()!=null?orderDO.getCustomerId():0,orderDO.getSalesmanId()!=null?orderDO.getSalesmanId():0,orderDO.getOrderId()) ;
orderService.checkOrderSalesman(orderDO, offerId, null, null, null, null);
orderService.updateOrderCustomerAndSalesmanId(orderDO.getCustomerId() != null ? orderDO.getCustomerId() : 0, orderDO.getSalesmanId() != null ? orderDO.getSalesmanId() : 0, orderDO.getOrderId());
}
private OrderDO generateOrder(OfferDO offerDO, OfferResultVO offerResultVO) {
......@@ -1525,4 +1534,12 @@ public class OfferServiceImpl extends AbstractService<OfferMapper, OfferDO> impl
}
return JSONObject.parseObject(offerDO.getEstCost(), EstCostVO.class);
}
@Override
public List<OfferRespVO> getCustomerOfferSelect(Long customerId, String searchKey) {
List<OfferDO> offerDOList = offerMapper.selectList(new LambdaQueryWrapper<OfferDO>().eq(OfferDO::getRelationId, customerId)
.like(StringUtils.isNotBlank(searchKey), OfferDO::getNumber, searchKey)
.orderByDesc(OfferDO::getOrderId).last("limit 10"));
return OfferConvert.INSTANCE.convertList(offerDOList);
}
}
......@@ -112,6 +112,9 @@ public class OfferBaseVO {
@ApiModelProperty(value = "客户经理ID")
private Long salesmanId;
@ApiModelProperty(value = "客户编号")
private String customerNumber;
@ApiModelProperty(value = "客户经理所属部门ID")
private Long deptId;
......
......@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.idempotent.core.annotation.Idempotent;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.sale.dal.dataobject.offer.OfferDO;
import cn.iocoder.yudao.module.sale.vo.offer.*;
import cn.iocoder.yudao.module.sale.vo.offerApproval.OfferApprovalBackInfoVO;
import cn.iocoder.yudao.module.system.api.permission.RoleApi;
......@@ -164,6 +165,15 @@ public class OfferController {
}
@GetMapping("/getNumber/{offerId}")
@ApiOperation("获得报价单编号")
@ApiImplicitParam(name = "offerId", value = "报价单ID", required = true, example = "1024", dataTypeClass = Long.class)
public CommonResult<String> getOfferNumber(@PathVariable("offerId") Long offerId) {
OfferDO offer = offerService.getOffer(offerId);
return success(offer.getNumber());
}
@GetMapping("/page")
@ApiOperation("获得报价单管理分页")
// @PreAuthorize("@ss.hasPermission('ecw:offer:query')")
......@@ -271,6 +281,18 @@ public class OfferController {
return success(respVOList);
}
@GetMapping("/customer/select")
@ApiOperation(value = "获得客户关联的报价单列表下拉框数据", notes = "获取客户关联的报价单列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "customerId", value = "客户id", required = true, example = "1024", dataTypeClass = Long.class),
@ApiImplicitParam(name = "searchKey", value = "关键字搜索(当前只支出报价单编号模糊匹配)", required = false, example = "1024", dataTypeClass = String.class),
})
public CommonResult<List<OfferRespVO>> getCustomerOfferSelect(@RequestParam("customerId") Long customerId, @RequestParam(value = "searchKey", required = false) String searchKey) {
// 核查订单关联报价单异常
List<OfferRespVO> respVOList = offerService.getCustomerOfferSelect(customerId,searchKey);
return success(respVOList);
}
@PutMapping("/association")
@ApiOperation(value = "订单关联报价单", notes = "订单关联报价单")
@ApiImplicitParams({
......
......@@ -221,6 +221,8 @@ public interface BoxMapper extends AbstractMapper<BoxDO> {
.in(CollectionUtil.isNotEmpty(vo.getStartWarehouseIdList()),BoxDO::getStartWarehouseId,vo.getStartWarehouseIdList())
.in(CollectionUtil.isNotEmpty(vo.getDestWarehouseIdList()),BoxDO::getDestWarehouseId,vo.getDestWarehouseIdList())
.in(CollectionUtil.isNotEmpty(vo.getBoxStatusList()),BoxDO::getStatus,vo.getBoxStatusList())
.in(CollectionUtil.isNotEmpty(vo.getShipmentStatusList()),BoxDO::getShipmentStatus,vo.getShipmentStatusList())
.in(CollectionUtil.isNotEmpty(vo.getShipmentStatusAirList()),BoxDO::getShipmentStatusAir,vo.getShipmentStatusAirList())
.in(CollectionUtil.isNotEmpty(vo.getDestinationClearanceList()),BoxDO::getDestinationClearance,vo.getDestinationClearanceList())
.in(CollectionUtil.isNotEmpty(vo.getDeliveryTypeList()), BoxDO::getDeliveryType, vo.getDeliveryTypeList())
.in(CollectionUtil.isNotEmpty(vo.getShippingChannelIdList()), BoxDO::getShippingChannelId, vo.getShippingChannelIdList())
......
......@@ -84,6 +84,7 @@ public interface BoxPreloadGoodsMapper extends AbstractMapper<BoxPreloadGoodsDO>
"eo.audit_type, ",
"eo.audit_result, ",
"eo.guan_lian_order_status, ",
"eo.unload_time, ",
"eo.container_number, ",
"eo.exception_reason, ",
"eo.package_type as advance_type, ",
......
package cn.iocoder.yudao.module.shipment.listener;
import cn.iocoder.yudao.framework.apollo.core.event.BoxCheckOrderApprovalEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrderApprovalEvent;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxApprovalDO;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxDO;
import cn.iocoder.yudao.module.shipment.enums.BoxApprovalTypeEnum;
......
package cn.iocoder.yudao.module.shipment.listener;
import cn.iocoder.yudao.framework.apollo.core.event.BoxCheckOrderDestWarehouseEvent;
import cn.iocoder.yudao.framework.apollo.core.event.BoxCheckOrderSchedulingEvent;
import cn.iocoder.yudao.framework.apollo.core.event.BoxCheckOrdersSchedulingEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrderDestWarehouseEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrderSchedulingEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrdersSchedulingEvent;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.depository.dal.dataobject.warehouse.WarehouseLineDO;
import cn.iocoder.yudao.module.depository.dal.mysql.warehouse.WarehouseLineMapper;
......
package cn.iocoder.yudao.module.shipment.listener;
import cn.iocoder.yudao.framework.apollo.core.event.BoxCheckOrderSchedulingEvent;
import cn.iocoder.yudao.framework.apollo.core.event.BoxOrderDynamicEstTimeEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxOrderDynamicEstTimeEvent;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxBookSeaDO;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxClearanceDO;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxDO;
......@@ -19,7 +18,6 @@ import org.springframework.stereotype.Component;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.order.enums.ErrorCodeConstants.WAREHOUSE_IN_BOX_EXCEPTION;
/**
* 查询订单动态的出货状态预计时间
......
package cn.iocoder.yudao.module.shipment.listener;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrderApprovalEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxOrderForceWarehouseCheckEvent;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxApprovalDO;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxDO;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxLoadInfoDO;
import cn.iocoder.yudao.module.shipment.enums.BoxApprovalTypeEnum;
import cn.iocoder.yudao.module.shipment.service.box.BoxService;
import cn.iocoder.yudao.module.shipment.service.boxApproval.BoxApprovalService;
import cn.iocoder.yudao.module.shipment.service.boxLoadInfo.BoxLoadInfoService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.order.enums.ErrorCodeConstants.WAREHOUSE_IN_BOX_EXCEPTION;
import static cn.iocoder.yudao.module.order.enums.OrderApprovalTypeResultEnum.*;
import static cn.iocoder.yudao.module.shipment.enums.ErrorCodeConstants.BOX_NOT_EXISTS;
/**
* 订单强制到仓业务执行
*
* @author zhengYi
*/
@Component("BoxOrderForceWarehouseCheckListener")
@AllArgsConstructor
@Slf4j
public class BoxOrderForceWarehouseCheckListener {
private final BoxLoadInfoService boxLoadInfoService;
private final BoxService boxService;
/**
* 订单强制到仓业务执行
*
* @param event 订单信息
*/
@EventListener(BoxOrderForceWarehouseCheckEvent.class)
public void orderForceWarehouseCheck(BoxOrderForceWarehouseCheckEvent event) {
BoxDO boxDO = boxService.getOne(new LambdaQueryWrapper<BoxDO>().eq(BoxDO::getSelfNo, event.getSelfNo()));
if (boxDO == null) {
throw exception(BOX_NOT_EXISTS);
}
// 跟新到仓时间到卸柜/到仓箱标数据表
boxLoadInfoService.update(new LambdaUpdateWrapper<BoxLoadInfoDO>()
.set(BoxLoadInfoDO::getUnloadTime, event.getUnloadTime())
.eq(BoxLoadInfoDO::getOrderId, event.getOrderId()));
if (event.getTransportId() == 1){
// 海运
boxLoadInfoService.updateOrderStatus(Arrays.asList(event.getOrderId()), event.getUnloadTime(), boxDO);
}else {
// 空运
boxLoadInfoService.updateOrderStatusAir(Arrays.asList(event.getOrderId()), event.getUnloadTime(), boxDO);
}
}
}
package cn.iocoder.yudao.module.shipment.listener;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxOrderForceWarehouseCheckEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxOrderRevokeWarehouseCheckEvent;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxDO;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxLoadInfoDO;
import cn.iocoder.yudao.module.shipment.service.box.BoxService;
import cn.iocoder.yudao.module.shipment.service.boxLoadInfo.BoxLoadInfoService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.shipment.enums.ErrorCodeConstants.BOX_NOT_EXISTS;
/**
* 订单撤销到仓业务执行
*
* @author zhengYi
*/
@Component("BoxOrderRevokeWarehouseCheckListener")
@AllArgsConstructor
@Slf4j
public class BoxOrderRevokeWarehouseCheckListener {
private final BoxLoadInfoService boxLoadInfoService;
private final BoxService boxService;
/**
* 订单强撤销到仓业务执行
*
* @param event 订单信息
*/
@EventListener(BoxOrderRevokeWarehouseCheckEvent.class)
public void orderForceWarehouseCheck(BoxOrderRevokeWarehouseCheckEvent event) {
// 跟新卸柜/到仓箱标数据表未真实卸柜的箱标到仓时间为null
boxLoadInfoService.update(new LambdaUpdateWrapper<BoxLoadInfoDO>()
.set(BoxLoadInfoDO::getUnloadTime, null)
.eq(BoxLoadInfoDO::getIsUnload, 0)
.eq(BoxLoadInfoDO::getOrderId, event.getOrderId()));
}
}
......@@ -660,19 +660,11 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
// 更新
BoxDO updateObj = BoxConvert.INSTANCE.convert(updateReqVO);
if (StringUtils.equals(TransportTypeEnum.AIR.getType(), transportType)) {
if (!Objects.equals(channelId, boxDO.getShippingChannelId()) || !Objects.equals(oldDestId, newDestId)) {
if (!Objects.equals(channelId, oldChannelId) || !Objects.equals(oldDestId, newDestId)) {
// 当箱子的渠道或者目的变更时,都需要重新生成自编号
// 先将原有的自编号记录做使用状态变更处理
String selfNo = "";
if (!Objects.equals(oldDestId, newDestId)) {
// 目的国变更,需要切换自编号
boxAirNumberRecordService.updateBoxAirNumberRecordUsedStatus(boxDO.getSelfNo());
// 再重新获取自编号
selfNo = getAirOrderNo(channelId, newDestId, transportType);
} else {
// 不是目的国变更,那么只是渠道变更,渠道变更只需要更新自编号规则,将原有记录更新
selfNo = chargeChannelAirOrderNo(boxDO.getSelfNo(), channelId, newDestId, transportType);
}
boxAirNumberRecordService.updateBoxAirNumberRecordUsedStatus(boxDO.getSelfNo());
// 再重新获取自编号
String selfNo = getAirOrderNo(channelId, newDestId, transportType);
updateObj.setSelfNo(selfNo);
}
} else {
......@@ -2000,7 +1992,7 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
orderSeaTimeEnum = OrderSeaTimeEnum.SEA_CLEARED;
break;
case UNLOADED:
if (Objects.isNull(businessTime)){
if (Objects.isNull(businessTime)) {
// 到仓业务时间为空时,不更新订单到仓动态
return;
}
......@@ -2040,7 +2032,7 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
orderAirTimeEnum = OrderAirTimeEnum.AIR_ARRIVED;
break;
case TO_WAREHOUSED:
if (Objects.isNull(businessTime)){
if (Objects.isNull(businessTime)) {
// 到仓业务时间为空时,不在做订单到仓动态更新
return;
}
......@@ -2128,7 +2120,7 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
boxLoadInfoQueryVO.setShipmentId(shipmentId);
List<BoxLoadInfoDO> loadInfoList = boxLoadInfoService.getBoxLoadInfoList(boxLoadInfoQueryVO);
long unloadNum = loadInfoList.stream()
.filter(t -> t.getIsUnload() == 1)
.filter(t -> Objects.nonNull(t.getUnloadTime()))
.count();
if (unloadNum != loadInfoList.size()) {
BoxDO boxDO = getBox(shipmentId);
......@@ -2155,10 +2147,19 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
//以secId排序
goodsItemList.sort(Comparator.comparing(BoxPreloadGoodsBackVO::getSecId));
List<ProductAttrDO> productAttrDOList = productAttrService.getProductAttrList();
Map<String, String> idNameMap = productAttrDOList.stream()
.collect(Collectors.toMap(attr -> String.valueOf(attr.getId()), ProductAttrDO::getAttrName));
//以订单ID分组
Map<Long, List<BoxPreloadGoodsBackVO>> orderMap = goodsItemList.stream()
Map<Long, List<BoxPreloadGoodsBackVO>> orderMap = goodsItemList.stream().peek(item ->{
item.setAttrNameList(
getAttrNameByIds(item.getProdAttrIds(), idNameMap)
);
item.setWarehouseInAttrNameList(
getAttrNameByIds(item.getWarehouseInProdAttrIds(), idNameMap)
);
})
.collect(Collectors.groupingBy(BoxPreloadGoodsBackVO::getOrderId));
List<BoxTallyDO> tallyDOList = boxTallyService.list(new LambdaQueryWrapper<BoxTallyDO>()
.eq(BoxTallyDO::getShipmentId, shipmentId)
);
......@@ -2182,7 +2183,8 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
if (boxTallyDO != null) {
BeanUtils.copyProperties(boxTallyDO, boxTallyBackVO);
}
Set<String> allWarehouseInAttrNameList = orderGoodsItemList.stream().map(BoxPreloadGoodsBackVO::getWarehouseInAttrNameList).flatMap(List::stream).collect(Collectors.toSet());
boxTallyBackVO.setAllWarehouseInAttrNameList(allWarehouseInAttrNameList);
BoxPreloadGoodsBackVO boxPreloadGoodsDO = orderGoodsItemList.get(0);
boxTallyBackVO.setAdvanceType(boxPreloadGoodsDO.getAdvanceType());
boxTallyBackVO.setOrderNo(boxPreloadGoodsDO.getOrderNo());
......@@ -2230,6 +2232,19 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
return boxTallyBackVOS;
}
private List<String> getAttrNameByIds(String attrIds, Map<String, String> idNameMap) {
if (StringUtils.isNotBlank(attrIds)) {
String[] attrIdArray = attrIds.split(",");
List<String> nameList = new ArrayList<>();
for (String attrId : attrIdArray) {
//map一定包含数据,否则是数据错误
nameList.add(idNameMap.get(attrId));
}
return nameList;
}
return null;
}
@Override
public List<BoxGuanlianOrderBackVO> getGuanLianOrderList(Long orderId) {
List<BoxGuanlianOrderBackVO> boxGuanlianBackVOS = new ArrayList<>();
......
......@@ -12,7 +12,7 @@ import cn.iocoder.yudao.module.shipment.dal.dataobject.boxAirNumberRecord.BoxAir
*/
public interface BoxAirNumberRecordService extends IService<BoxAirNumberRecordDO> {
public static List<String> PUBLIC_CHANNEL_CODE_LIST = Arrays.asList("AF","AS","AN");
/**
* 获得空运出货单编号记录
*
......
......@@ -88,9 +88,12 @@ public class BoxAirNumberRecordServiceImpl extends AbstractService<BoxAirNumberR
throw exception(CHANNEL_CODE_NOT_SET, I18nMessage.getLang() == 0 ? event.getNameZh() : event.getNameEn());
}
String channelCode = event.getCode();
// 注意:这里查询未使用的记录编号时要区分公共渠道编号和非公共渠道编号参数
BoxAirNumberRecordDO boxAirNumberRecordDO = boxAirNumberRecordMapper.selectOne(new LambdaQueryWrapper<BoxAirNumberRecordDO>()
.eq(BoxAirNumberRecordDO::getTransportType, transportType)
.eq(BoxAirNumberRecordDO::getDestCountryCode, destCountryCode)
.eq(!PUBLIC_CHANNEL_CODE_LIST.contains(channelCode), BoxAirNumberRecordDO::getChannelCode, channelCode)
.in(PUBLIC_CHANNEL_CODE_LIST.contains(channelCode), BoxAirNumberRecordDO::getChannelCode, PUBLIC_CHANNEL_CODE_LIST)
.eq(BoxAirNumberRecordDO::getUsed, 0)
.orderByAsc(BoxAirNumberRecordDO::getId).last("limit 1"));
if (Objects.nonNull(boxAirNumberRecordDO)) {
......@@ -148,6 +151,8 @@ public class BoxAirNumberRecordServiceImpl extends AbstractService<BoxAirNumberR
.eq(BoxAirNumberRecordDO::getNumber, number)
.eq(BoxAirNumberRecordDO::getTransportType, transportType)
.eq(BoxAirNumberRecordDO::getDestCountryCode, destCountryCode)
.eq(!PUBLIC_CHANNEL_CODE_LIST.contains(channelCode), BoxAirNumberRecordDO::getChannelCode, channelCode)
.in(PUBLIC_CHANNEL_CODE_LIST.contains(channelCode), BoxAirNumberRecordDO::getChannelCode, PUBLIC_CHANNEL_CODE_LIST)
.orderByAsc(BoxAirNumberRecordDO::getId).last("limit 1"));
if (Objects.nonNull(boxAirNumberRecordDO)) {
// 修改自编号逻辑
......@@ -173,9 +178,12 @@ public class BoxAirNumberRecordServiceImpl extends AbstractService<BoxAirNumberR
private BoxAirNumberRecordDO generateNewBoxAirNumberRecordDO(Integer transportType, Long destId, Long channelId, String destCountryCode, String channelCode, Long userId) {
BoxAirNumberRecordDO boxAirNumberRecordDO;
// 先获取最大的自编号
// 注意:这里查询未使用的记录编号时要区分公共渠道编号和非公共渠道编号参数
BoxAirNumberRecordDO maxBoxAirNumberRecordDO = boxAirNumberRecordMapper.selectOne(new LambdaQueryWrapper<BoxAirNumberRecordDO>()
.eq(BoxAirNumberRecordDO::getTransportType, transportType)
.eq(BoxAirNumberRecordDO::getDestCountryCode, destCountryCode)
.eq(!PUBLIC_CHANNEL_CODE_LIST.contains(channelCode), BoxAirNumberRecordDO::getChannelCode, channelCode)
.in(PUBLIC_CHANNEL_CODE_LIST.contains(channelCode), BoxAirNumberRecordDO::getChannelCode, PUBLIC_CHANNEL_CODE_LIST)
.orderByDesc(BoxAirNumberRecordDO::getId).last("limit 1"));
// 根据最大的自编号生成最新的自编号
String preChannelCode = "";
......
......@@ -4,11 +4,13 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.service.IService;
import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxDO;
import cn.iocoder.yudao.module.shipment.dal.dataobject.BoxLoadInfoDO;
import cn.iocoder.yudao.module.shipment.vo.boxLoadInfo.*;
import javax.validation.Valid;
import java.util.Collection;
import java.util.Date;
import java.util.List;
/**
......@@ -89,6 +91,8 @@ public interface BoxLoadInfoService extends IService<BoxLoadInfoDO> {
void unloadAllBoxInfo(BoxLoadInfoCreateReqVO createReqVO);
void updateOrderStatusAir(Collection<Long> orderIdSet, Date ulBoxTime, BoxDO boxDO);
void updateOrderStatus(Collection<Long> orderIdSet, Date ulBoxTime, BoxDO boxDO);
/**
* 批量删除标签号
* @param orderNumCodeList 标签号列表
......
......@@ -780,6 +780,7 @@ public class BoxLoadInfoServiceImpl extends AbstractService<BoxLoadInfoMapper, B
// boxService.updateUlBoxTime(shipmentId, ulBoxTime);
}
private void updateOrderStatusAir(Collection<Long> orderIdSet, Date ulBoxTime, Long shipmentId) {
//校验这些订单是否已经到港,已经清关
checkArrivalAndClearance(orderIdSet, shipmentId);
......@@ -790,6 +791,17 @@ public class BoxLoadInfoServiceImpl extends AbstractService<BoxLoadInfoMapper, B
boxService.addOrderLog(orderIdSet, OrderShipmentLog.CABINET_WAREHOUSE, "");
}
@Override
public void updateOrderStatusAir(Collection<Long> orderIdSet, Date ulBoxTime, BoxDO boxDO) {
//校验这些订单是否已经到港,已经清关
checkArrivalAndClearance(orderIdSet, boxDO.getId());
boxService.updateOrderStatusByOrderIdAndTransportType(orderIdSet, OrderStatusEnum.UNLOADED_CABINET.getValue(),
OrderStatusMsgEnum.UNLOADED_CABINET.getInWarehouseState(),
BoxAirStatusEnum.TO_WAREHOUSED.getStatus(), null, null, ulBoxTime, null, Integer.parseInt(TransportTypeEnum.AIR.getType()));
boxService.addOrderLog(orderIdSet, OrderShipmentLog.CABINET_WAREHOUSE, "");
}
private void updateOrderStatus(Collection<Long> orderIdSet, Date ulBoxTime, Long shipmentId) {
BoxDO boxDO = boxService.getById(shipmentId);
boxService.updateOrderStatusByOrderIdAndTransportType(orderIdSet, OrderStatusEnum.UNLOADED_CABINET.getValue(),
......@@ -798,6 +810,13 @@ public class BoxLoadInfoServiceImpl extends AbstractService<BoxLoadInfoMapper, B
boxService.addOrderLog(orderIdSet, OrderShipmentLog.CABINET_WAREHOUSE, "");
}
public void updateOrderStatus(Collection<Long> orderIdSet, Date ulBoxTime, BoxDO boxDO) {
boxService.updateOrderStatusByOrderIdAndTransportType(orderIdSet, OrderStatusEnum.UNLOADED_CABINET.getValue(),
OrderStatusMsgEnum.UNLOADED_CABINET.getInWarehouseState(),
BoxStatusEnum.UNLOADED.getStatus(), null, null, ulBoxTime, null, Integer.parseInt(boxDO.getTransportType()));
boxService.addOrderLog(orderIdSet, OrderShipmentLog.CABINET_WAREHOUSE, "");
}
/**
* 校验订单是否已经到港和清关
* @param orderIdSet 到仓订单
......
......@@ -197,7 +197,7 @@ public class BoxPreloadGoodsServiceImpl extends AbstractService<BoxPreloadGoodsM
.eq(BoxPreloadGoodsDO::getIsRemove, 0)
);
OrderDO orderDO = orderService.getById(orderId);
OrderApprovalTypeCheckEvent approvalTypeCheckEvent = new OrderApprovalTypeCheckEvent(orderDO.getOrderId(), null, null, Arrays.asList(1,2,3,4,5,12,31,32) , false);
OrderApprovalTypeCheckEvent approvalTypeCheckEvent = new OrderApprovalTypeCheckEvent(orderDO.getOrderId(), null, null, Arrays.asList(6,11,13,14,22,23) , false);
applicationContext.publishEvent(approvalTypeCheckEvent);
if (approvalTypeCheckEvent.getResult()) {
throw exception(ORDER_IS_APPROVAL_IN_PROCESS);
......@@ -209,7 +209,7 @@ public class BoxPreloadGoodsServiceImpl extends AbstractService<BoxPreloadGoodsM
List<GuanLianOrderStatusVO> approvalGuanLianOrderList = guanLianOrderStatusVOList.stream().filter(vo -> vo.getType() == 2).collect(Collectors.toList());
if (CollectionUtil.isNotEmpty(approvalGuanLianOrderList)){
String orderNoStr = approvalGuanLianOrderList.stream().filter(o -> {
OrderApprovalTypeCheckEvent guanLianApprovalTypeCheckEvent = new OrderApprovalTypeCheckEvent(o.getOrderId(), null, null, Arrays.asList(1,2,3,4,5,12,31,32) , false);
OrderApprovalTypeCheckEvent guanLianApprovalTypeCheckEvent = new OrderApprovalTypeCheckEvent(o.getOrderId(), null, null, Arrays.asList(6,11,13,14,22,23) , false);
applicationContext.publishEvent(guanLianApprovalTypeCheckEvent);
return guanLianApprovalTypeCheckEvent.getResult();
}).map(GuanLianOrderStatusVO::getOrderNo).collect(Collectors.joining(StrUtil.COMMA));
......@@ -782,7 +782,7 @@ public class BoxPreloadGoodsServiceImpl extends AbstractService<BoxPreloadGoodsM
OrderDO orderDO,
List<Long> orderItemIdList) {
//订单校验是否在审核中
OrderApprovalTypeCheckEvent approvalTypeCheckEvent = new OrderApprovalTypeCheckEvent(orderDO.getOrderId(), null, null, Arrays.asList(1,2,3,4,5,12,31,32) , false);
OrderApprovalTypeCheckEvent approvalTypeCheckEvent = new OrderApprovalTypeCheckEvent(orderDO.getOrderId(), null, null, Arrays.asList(6,11,13,14,22,23) , false);
applicationContext.publishEvent(approvalTypeCheckEvent);
if (approvalTypeCheckEvent.getResult()) {
throw exception(ORDER_IS_APPROVAL_IN_PROCESS);
......@@ -794,7 +794,7 @@ public class BoxPreloadGoodsServiceImpl extends AbstractService<BoxPreloadGoodsM
// List<GuanLianOrderStatusVO> approvalGuanLianOrderList = guanLianOrderStatusVOList.stream().filter(vo -> vo.getType() == 2).collect(Collectors.toList());
// if (CollectionUtil.isNotEmpty(approvalGuanLianOrderList)){
// String orderNoStr = approvalGuanLianOrderList.stream().filter(o -> {
// OrderApprovalTypeCheckEvent guanLianApprovalTypeCheckEvent = new OrderApprovalTypeCheckEvent(o.getOrderId(), null, null, Arrays.asList(1,2,3,4,5,12,31,32) , false);
// OrderApprovalTypeCheckEvent guanLianApprovalTypeCheckEvent = new OrderApprovalTypeCheckEvent(o.getOrderId(), null, null, Arrays.asList(6,11,13,14,22,23) , false);
// applicationContext.publishEvent(guanLianApprovalTypeCheckEvent);
// return guanLianApprovalTypeCheckEvent.getResult();
// }).map(GuanLianOrderStatusVO::getOrderNo).collect(Collectors.joining(StrUtil.COMMA));
......@@ -2300,7 +2300,7 @@ public class BoxPreloadGoodsServiceImpl extends AbstractService<BoxPreloadGoodsM
OrderConsigneeDO filterConsigneeDO = getFilterOrderConsigneeDO(boxDO, loadList);
OrderDO orderDO = orderService.getById(orderId);
OrderApprovalTypeCheckEvent approvalTypeCheckEvent = new OrderApprovalTypeCheckEvent(orderDO.getOrderId(), null, null, Arrays.asList(1,2,3,4,5,12,31,32) , false);
OrderApprovalTypeCheckEvent approvalTypeCheckEvent = new OrderApprovalTypeCheckEvent(orderDO.getOrderId(), null, null, Arrays.asList(6,11,13,14,22,23) , false);
applicationContext.publishEvent(approvalTypeCheckEvent);
if (approvalTypeCheckEvent.getResult()) {
throw exception(ORDER_IS_APPROVAL_IN_PROCESS);
......
......@@ -146,6 +146,9 @@ public class BoxQueryVO {
@ApiModelProperty(value = "状态多选")
private List<Integer> boxStatusList;
@ApiModelProperty(value = "海运出货状态多选")
private List<Integer> shipmentStatusList;
@ApiModelProperty(value = "起运港多选")
private List<Long> bigPortIdList;
......@@ -295,4 +298,8 @@ public class BoxQueryVO {
@ApiModelProperty(value = "代理公司Agent多选")
private List<Long> agentIdList;
@ApiModelProperty(value = "空运状态多选")
private List<Integer> shipmentStatusAirList;
}
......@@ -12,17 +12,22 @@ import cn.iocoder.yudao.module.order.vo.orderException.OrderExceptionBackVO;
import cn.iocoder.yudao.module.order.vo.orderLocation.OrderLocationBackVO;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Data
@ApiModel("管理后台 - 装柜订单货物 Response VO")
public class BoxLoadOrderVO {
......@@ -39,6 +44,11 @@ public class BoxLoadOrderVO {
@ApiModelProperty("报关方式类型")
private Integer customsType;
@ApiModelProperty("卸柜/到仓时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date unloadTime;
@ApiModelProperty(value = "始发仓名称")
private String startWarehouseName;
......
......@@ -12,6 +12,7 @@ import cn.iocoder.yudao.module.order.vo.order.WarehouseInInfoVO;
import cn.iocoder.yudao.module.order.vo.orderLocation.OrderLocationBackVO;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -58,6 +59,11 @@ public class BoxPreloadGoodsBackVO {
@ApiModelProperty("订单编号")
private String orderNo;
@ApiModelProperty("卸柜/到仓时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date unloadTime;
@ApiModelProperty("运输方式ID")
private Integer transportId;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment