Commit 0d7b7233 authored by xiamw's avatar xiamw
parents cab14a5b 0662e990
version: '3'
services:
api-jiedao-operator:
image: harbor.jiedao.com/api-jiedao-operator:latest
container_name: api-jiedao-operator
api-jd-test:
image: harbor.com/api-jd-test:latest
container_name: api-jd-test
ports:
- "9001:9001"
environment:
env: test
volumes:
- '/etc/localtime:/etc/localtime'
- '/data/docker/apps/jiedao/api/logs/operator:/logs'
- '/data/docker/apps/jiedao/static:/app/static'
- '/data/docker/apps/jiedao/fonts/zh:/usr/share/fonts/zh'
- '/data/apps/jd/test/api/logs/operator:/logs'
- '/data/apps/jd/test/static:/app/static'
- '/data/apps/jd/test/fonts/zh:/usr/share/fonts/zh'
restart: always
ulimits:
nproc: 65535
......@@ -24,9 +24,9 @@ services:
cpus: '4'
memory: 4G
networks:
app-net:
net:
ipv4_address: 10.10.0.20
networks:
app-net:
net:
external: true
......@@ -11,7 +11,7 @@
Target Server Version : 80031 (8.0.31)
File Encoding : 65001
Date: 18/10/2024 09:26:20
Date: 24/10/2024 09:12:01
*/
SET NAMES utf8mb4;
......@@ -35,4 +35,8 @@ CREATE TABLE `member_user_level_config` (
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '会员等级配置表' ROW_FORMAT = DYNAMIC;
-- ----------------------------
-- Records of member_user_level_config
-- ----------------------------
INSERT INTO `member_user_level_config` VALUES (1, 'vip1', 0, 100, 'https://statictest.groupage.cn/2024/09/06/66dac1dfe4b0e404e1c7816f.png', '1', '2024-09-03 10:05:14', '1', '2024-09-06 16:48:34', 0);
SET FOREIGN_KEY_CHECKS = 1;
This diff is collapsed.
SET FOREIGN_KEY_CHECKS = 0;
INSERT INTO `jiedao`.`system_sms_template` (`id`, `type`, `status`, `code`, `name`, `content`, `params`, `remark`, `api_template_id`, `channel_id`, `channel_code`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `content_en`, `api_template_id_en`) VALUES (55, 3, 0, 'user-sms-redeem-reward', '积分兑换验证码', '积分兑换验证码:${code},请勿将验证码泄露给他人,以免造成不必要的损失,两分钟之内有效!', '[\"code\"]', NULL, 'SMS_471775248', 6, 'ALIYUN', '2696', '2024-08-20 10:06:06', '2696', '2024-08-20 10:14:39', b'0', '[ECLogistics]Your login code is:{code}, do not disclose this code to others to avoid any unnecessary loss, within 20 minutes effective!', 'SMS_199790126');
SET FOREIGN_KEY_CHECKS = 1;
\ No newline at end of file
-- 增加报价单目的国字段
alter table ecw_offer add COLUMN dest_country_id bigint DEFAULT 0 comment '目的国id';
update ecw_offer o join ecw_warehouse_line l on o.line_id = l.id join ecw_warehouse w on w.id = l.dest_warehouse_id set o.dest_country_id = w.guojia;
\ No newline at end of file
-- 客户主营类型 由 单个 改为 多个逗号分隔
alter table `ecw_customer`
change column `product_type` `product_types` varchar(300) DEFAULT NULL COMMENT '主营类型,多个逗号分隔';
-- 因为客户跟进表会有原来的跟进数据录入,故需要先把原来的跟进跟进编号录入到日志表中
-- 注意更新后 需要在应用启动前执行。因为此表会缓存。
insert into ecw_order_number_log(number_key, `number`, type, version, creator, create_time, updater, update_time, deleted)
select 'followup:new:number', max(`number`), 6, 0, 1, CURRENT_TIMESTAMP, 1, CURRENT_TIMESTAMP, 0 from ecw_customer_followup;
-- 增加订单的到仓数据字段
alter table ecw_order
add COLUMN `check_num` int DEFAULT '0' COMMENT '到仓件数';
alter table ecw_order
add COLUMN `check_volume` decimal(10, 2) DEFAULT '0.00' COMMENT '到仓体积';
alter table ecw_order
add COLUMN `check_quantity` int DEFAULT '0' COMMENT '到仓数量';
alter table ecw_order
add COLUMN `check_weight` decimal(10, 2) DEFAULT '0.00' COMMENT '到仓重量';
-- 跟进记录菜单
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 ( '跟进记录', '', 2, 1, 1417, 'offer/logList', 'log', 'ecw/offer/logList', 0, '2702', '2024-10-27 12:02:57', '2702', '2024-10-27 12:04:30', b'0', b'1', 'followLog', b'0', NULL, NULL);
......@@ -221,6 +221,40 @@ public class CodeUtils {
}
}
/**
* 功能描述: 自动生成跟进单单号. 格式: GJ+年份YYYY+六位数
*
* @param maxOddNumbers 数据库中的最新单号
* @return java.lang.String
*/
public static String getOddFollowupNumbers(String maxOddNumbers) {
// 格式: GJ+年份YYYY+六位数
int numberLength = 14;
//获取当前日期并将其进行格式化
String formatYear = getDateTime("yyyy");
int newEndIntNum;
//判断数据中的最大单号是否存在,是否包含当前日期
if (StringUtils.isNotEmpty(maxOddNumbers) && maxOddNumbers.length() == numberLength &&
maxOddNumbers.substring(2, 8).equals(formatYear)) {
//截取后四位数
String endNum = maxOddNumbers.substring(maxOddNumbers.length() - 6);
//把截取的最后六位数解析为int
int endIntNum = Integer.parseInt(endNum);
//在将其加1(自增1)
newEndIntNum = endIntNum + 1;
} else {
// 如果为空(第一次生成)或者当前最大订单号的日期与当前日期不一致说明需要重新计数生成单号
newEndIntNum = 1;
}
//生成单号
String newOddNumber = String.format("%s%s%06d", "GJ", formatYear, newEndIntNum);
//将单号返回
return newOddNumber;
}
/**
* 功能描述: 自动生成收款单单单号
......
......@@ -105,7 +105,7 @@ public class CustomerDO extends BaseDO {
/**
* 产品类型
*/
private Long productType;
private String productTypes;
/**
* 产品id
*/
......
......@@ -73,7 +73,8 @@ public interface CustomerMapper extends BaseMapperX<CustomerDO> {
"",
"country.name_zh as country_name_zh, country.name_en as country_name_en,",
"",
"pt.title_zh as product_type_name_zh, pt.title_en as product_type_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, ",
......@@ -96,7 +97,6 @@ public interface CustomerMapper extends BaseMapperX<CustomerDO> {
"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 ecw_product_type pt on c.product_type = pt.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",
......
......@@ -35,4 +35,6 @@ public interface ErrorCodeConstants {
ErrorCode FOLLOWUP_NOT_EXISTS = new ErrorCode(1005001013, "客户跟进不存在");
ErrorCode FOLLOWUP_ALREADY_SUBMITTED = new ErrorCode(1005001014, "客户跟进已提交不可再修改");
ErrorCode FOLLOWUP_NUMBER_NOT_NULL = new ErrorCode(1005001015, "客户跟进编号不能为空");
}
......@@ -43,8 +43,8 @@ public class CustomerCreateReqVO extends CustomerBaseVO {
@ApiModelProperty(value = "联系地址")
private String address;
@ApiModelProperty(value = "产品类型id")
private Long productType;
@ApiModelProperty(value = "产品类型ids,多个逗号分隔")
private String productTypes;
@ApiModelProperty(value = "产品ids")
private String productIds;
......
......@@ -67,7 +67,7 @@ public class CustomerDetailRespVO extends CustomerBaseVO {
private String address;
@ApiModelProperty(value = "产品类型id")
private Long productType;
private String productTypes;
@ApiModelProperty(value = "产品ids")
private String productIds;
......
......@@ -50,8 +50,8 @@ public class CustomerUpdateReqVO extends CustomerBaseVO {
@ApiModelProperty(value = "联系地址")
private String address;
@ApiModelProperty(value = "产品类型")
private Long productType;
@ApiModelProperty(value = "产品类型ids,多个逗号分隔")
private String productTypes;
@ApiModelProperty(value = "产品ids")
private String productIds;
......
......@@ -21,15 +21,25 @@ public class CustomerFollowupQueryVO extends PageParam {
@ApiModelProperty(value = "状态 字典customer_followup_status")
private Integer status;
@ApiModelProperty(value = "客户编号")
@ApiModelProperty(value = "客户id")
private Long customerId;
@ApiModelProperty(value = "客户编号")
private String customerNumber;
@ApiModelProperty(value = "客户编号")
private Long customerDetailId;
@ApiModelProperty(value = "报价单")
@ApiModelProperty(value = "报价单id")
private Long offerId;
@ApiModelProperty(value = "报价单id列表")
private List<Long> offerIds;
@ApiModelProperty(value = "报价单编号")
private String offerNumber;
@ApiModelProperty(value = "跟进类型 字典customer_followup_type")
private Integer followType;
......@@ -85,6 +95,15 @@ public class CustomerFollowupQueryVO extends PageParam {
@ApiModelProperty(value = "结束创建时间")
private Date endCreateTime;
// 更新时间
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始更新时间")
private Date beginUpdateTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束更新时间")
private Date endUpdateTime;
@ApiModelProperty(value = "跟进类型,下拉多选")
private List<Integer> followTypes;
......@@ -96,4 +115,13 @@ public class CustomerFollowupQueryVO extends PageParam {
@ApiModelProperty(value = "跟进状态,下拉多选")
private List<Integer> statuses;
@ApiModelProperty(value = "客户经理/跟进业务员ids")
private List<Long> followUserIds;
@ApiModelProperty(value = "联系人电话")
private String contactPhone;
}
......@@ -7,6 +7,7 @@ import lombok.EqualsAndHashCode;
import lombok.ToString;
import javax.validation.constraints.NotNull;
import java.util.List;
@ApiModel("管理后台 - 客户跟进更新状态 Request VO")
@Data
......@@ -17,6 +18,11 @@ public class CustomerFollowupUpdateStatusReqVO {
@NotNull(message = "主键不能为空")
private Long id;
//ids
@ApiModelProperty(value = "主键列表", required = true)
@NotNull(message = "主键列表不能为空")
private List<Long> ids;
@ApiModelProperty(value = "状态 字典customer_followup_status")
private Integer status;
......
......@@ -20,8 +20,8 @@
<if test="query.customerId != null">
AND a.customer_id = #{query.customerId}
</if>
<if test="query.offerId != null">
AND a.offer_id = #{query.offerId}
<if test="query.offerIds != null and query.offerIds.size() > 0">
AND FIND_IN_SET(a.offer_id, #{query.offerIds})
</if>
<if test="query.followType != null">
......@@ -38,35 +38,53 @@
AND a.result_type = #{query.resultType}
</if>
<if test="query.followTypes != null and query.followTypes.size()>0">
AND
<foreach item='item' index="index" collection='query.followTypes' open='(' separator='or' close=')'>
FIND_IN_SET(#{item}, a.follow_type)
</foreach>
<if test="query.followTypes != null and query.followTypes.size() > 0">
AND FIND_IN_SET(a.follow_type, #{query.followTypes})
</if>
<if test="query.followMethods != null and query.followMethods.size()>0">
AND
<foreach item='item' index="index" collection='query.followMethods' open='(' separator='or' close=')'>
FIND_IN_SET(#{item}, a.follow_method)
</foreach>
AND FIND_IN_SET(a.follow_method, #{query.followMethods})
</if>
<if test="query.resultTypes != null and query.resultTypes.size()>0">
AND
<foreach item='item' index="index" collection='query.resultTypes' open='(' separator='or' close=')'>
FIND_IN_SET(#{item}, a.result_type)
</foreach>
AND FIND_IN_SET(a.result_type, #{query.resultTypes})
</if>
<if test="query.statuses != null and query.statuses.size()>0">
AND
<foreach item='item' index="index" collection='query.statuses' open='(' separator='or' close=')'>
FIND_IN_SET(#{item}, a.status)
</foreach>
AND FIND_IN_SET(a.status, #{query.statuses})
</if>
<if test="query.followUserIds!= null and query.followUserIds.size() > 0">
AND FIND_IN_SET(a.follow_user_id, #{query.followUserIds})
</if>
<if test="query.beginFollowTime != null and query.endFollowTime != null">
AND ( a.follow_time BETWEEN #{query.beginFollowTime} AND #{query.endFollowTime} )
</if>
<if test="query.beginNextTime!= null and query.endNextTime!= null">
AND ( a.next_time BETWEEN #{query.beginNextTime} AND #{query.endNextTime} )
</if>
<if test="query.beginCreateTime!= null and query.endCreateTime!= null">
AND ( a.create_time BETWEEN #{query.beginCreateTime} AND #{query.endCreateTime} )
</if>
<if test="query.beginUpdateTime!= null and query.endUpdateTime!= null">
AND ( a.update_time BETWEEN #{query.beginUpdateTime} AND #{query.endUpdateTime} )
</if>
<if test="query.contactPhone != null and query.contactPhone != '' ">
AND concat('+', g.area_code, g.phone_new, '') LIKE concat('%', concat( #{query.contactPhone}, '%' ))
</if>
<if test="query.customerNumber != null and query.customerNumber != '' ">
AND b.number LIKE concat('%', concat( #{query.customerNumber}, '%' ))
</if>
<if test="query.offerNumber != null and query.offerNumber != '' ">
AND c.number LIKE concat('%', concat( #{query.offerNumber}, '%' ))
</if>
</sql>
<select id="selectPage1" resultType="cn.iocoder.yudao.module.customer.dal.dataobject.customerFollowup.CustomerFollowupDO">
......@@ -96,6 +114,12 @@
<select id="selectCount1" resultType="java.lang.Long">
select count(1)
from ecw_customer_followup a
left join ecw_customer b on a.customer_id = b.id
left join ecw_offer c on a.offer_id = c.offer_id
left join system_user d on a.creator = d.id
left join system_user e on a.updater = e.id
left join system_user f on a.follow_user_id = f.id
left join ecw_customer_contacts g on a.contact_id = g.id
WHERE 1=1 AND a.deleted = 0
<include refid="queryCondition"/>
</select>
......
......@@ -699,7 +699,7 @@
<if test="query.productTypes != null and query.productTypes.size()>0">
AND
<foreach item='item' index="index" collection='query.productTypes' open='(' separator='or' close=')'>
FIND_IN_SET(#{item}, contact.product_type)
FIND_IN_SET(#{item}, contact.product_types)
</foreach>
</if>
<!--主营商品名称-->
......
......@@ -379,17 +379,11 @@ public class CustomerController {
if (customerDOSaved == null) {
throw exception(ErrorCodeConstants.CUSTOMER_SAVED_NOT_EXISTS);
}
if (customerDOSaved.getCustomerService() == null) {
throw exception(ErrorCodeConstants.CUSTOMER_SAVED_CUSTOMER_SERVICE_IS_NULL);
}
CustomerDO customerDODeleted = customerService.getById(par.getCustomerIdDeleted());
if (customerDODeleted == null) {
throw exception(ErrorCodeConstants.CUSTOMER_DELETED_NOT_EXISTS);
}
if (customerDODeleted.getCustomerService() == null) {
throw exception(ErrorCodeConstants.CUSTOMER_DELETED_CUSTOMER_SERVICE_IS_NULL);
}
if (!customerDOSaved.getCustomerService().equals(customerDODeleted.getCustomerService())) {
if (!Objects.equals(customerDOSaved.getCustomerService(), customerDODeleted.getCustomerService())) {
throw exception(ErrorCodeConstants.CUSTOMER_MERGE_CUSTOMER_SERVICE_NOT_SAME);
}
......
......@@ -7,7 +7,6 @@ import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.module.customer.dal.dataobject.customer.CustomerDO;
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.customerContacts.CustomerContactsDO;
import cn.iocoder.yudao.module.customer.dal.dataobject.customerFollowup.CustomerFollowupDO;
import cn.iocoder.yudao.module.customer.service.customer.CustomerService;
......@@ -33,6 +32,7 @@ import cn.iocoder.yudao.module.wealth.service.commissionPayment.CommissionPaymen
import cn.iocoder.yudao.module.wealth.service.receipt.ReceiptServiceImpl;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.beanutils.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
......@@ -338,12 +338,22 @@ public class CustomerMergeServiceImpl implements CustomerMergeService {
if (CollectionUtil.isNotEmpty(cuscontactList2)) {
for (CustomerContactsDO d : cuscontactList2
) {
d.setCustomerId(customerDOSaved.getId());
//被合并的客户联系人,默认为非默认
d.setIsDefault(0);
d.setUpdateTime(new Date());
d.setUpdater(String.valueOf(loginUserId));
customerContactsService.updateById(d);
try {
// 1、联系人copy一份
CustomerContactsDO newCustomer = new CustomerContactsDO();
BeanUtils.copyProperties(newCustomer, d);
newCustomer.setId(null);
//被合并的客户联系人,默认为非默认
newCustomer.setIsDefault(0);
// 设置被合并客户的联系人
newCustomer.setCustomerId(customerDOSaved.getId());
customerContactsService.save(newCustomer);
// 2、删除被合并客户的联系人
customerContactsService.deleteCustomerContacts(d.getId());
} catch (Exception e) {
log.error("合并客户联系人失败", e);
}
}
}
}
......
......@@ -42,6 +42,16 @@ public class CustomerFollowupController {
@Resource
private FileMakeApi fileMakeApi;
@GetMapping("/getFollowupNewNumber")
@ApiOperation("获得最新的跟进编号")
public CommonResult<String> getFollowupNewNumber() {
String number = followupService.generateFollowupNumber();
return success(number);
}
@PostMapping("/create")
@ApiOperation("创建客户跟进")
// @PreAuthorize("@ss.hasPermission('customer:followup:create')")
......
......@@ -60,12 +60,10 @@ import static cn.iocoder.yudao.module.member.enums.TransportTypeEnum.SPECIAL_LIN
@Service
@Validated
public class ScoreRuleServiceImpl extends AbstractService<ScoreRuleMapper, ScoreRuleDO> implements ScoreRuleService {
private static final String PROD_REGISTER_URL = "https://app2.groupage.cn/#/pages/register/shareRegister?code=";
private static final String UAT_REGISTER_URL = "https://apptest.groupage.cn/#/pages/register/shareRegister?code=";
private static final String PROD_SHARE_URL = "https://app2.groupage.cn/#";
private static final String UAT_SHARE_URL = "https://apptest.groupage.cn/#";
@Value("${spring.profiles.active}")
private String env;
@Value("${yudao.member.register-url}")
private String registerUrl;
@Value("${yudao.member.share-url}")
private String shareUrl;
@Resource
private ScoreRuleMapper scoreRuleMapper;
@Resource
......@@ -659,19 +657,15 @@ public class ScoreRuleServiceImpl extends AbstractService<ScoreRuleMapper, Score
ScoreRulerRecommendExtraVO scoreRulerRecommendExtraVO = JsonUtils.parseObject(scoreRuleDO.getExtra(), ScoreRulerRecommendExtraVO.class);
appScoreRuleListBackVO.setExtraRecommend(scoreRulerRecommendExtraVO);
MemberUserDO memberUserDO = memberUserService.getUser(reqVO.getMemberId());
if (memberUserDO != null && !"pro".equals(env)) {
appScoreRuleListBackVO.setRecommendUrl(UAT_REGISTER_URL + memberUserDO.getCode());
} else if (memberUserDO != null) {
appScoreRuleListBackVO.setRecommendUrl(PROD_REGISTER_URL + memberUserDO.getCode());
if (memberUserDO != null) {
appScoreRuleListBackVO.setRecommendUrl(registerUrl + memberUserDO.getCode());
}
} else if (scoreRuleDO.getType() == ScoreRuleTypeEnum.SHARE.getValue()) {
ScoreRuleShareExtraVO scoreRuleShareExtraVO = JsonUtils.parseObject(scoreRuleDO.getExtra(), ScoreRuleShareExtraVO.class);
MemberUserDO memberUserDO = memberUserService.getUser(reqVO.getMemberId());
String activityUrl = scoreRuleShareExtraVO.getActivityUrl();
if (memberUserDO != null && !"pro".equals(env)) {
scoreRuleShareExtraVO.setActivityUrl(UAT_SHARE_URL + activityUrl);
} else if (memberUserDO != null) {
scoreRuleShareExtraVO.setActivityUrl(PROD_SHARE_URL + activityUrl);
if (memberUserDO != null) {
scoreRuleShareExtraVO.setActivityUrl(shareUrl + activityUrl);
}
appScoreRuleListBackVO.setExtraShare(scoreRuleShareExtraVO);
}
......
......@@ -669,7 +669,17 @@ public class OrderDO extends BaseDO {
private Boolean isInOpenSea;
@ApiModelProperty(value = "到仓件数")
private Integer checkNum;
@ApiModelProperty(value = "到仓数量")
private Integer checkQuantity;
@ApiModelProperty(value = "到仓体积")
private BigDecimal checkVolume;
@ApiModelProperty(value = "到仓重量")
private BigDecimal checkWeight;
@ApiModelProperty(value = "订单修改是否变动了归属客户,此字段用来判定订单是否需要重置归属客户经理,下单后归属客户的客户经理是固定的,除非订单归属客户变动,才需要重置客户经理")
@TableField(exist = false)
......
......@@ -549,6 +549,18 @@ public class OrderBackInfoDto {
@ApiModelProperty(value = "放货箱数")
private Integer releaseNum;
@ApiModelProperty(value = "到仓件数")
private Integer checkNum;
@ApiModelProperty(value = "到仓数量")
private Integer checkQuantity;
@ApiModelProperty(value = "到仓体积")
private BigDecimal checkVolume;
@ApiModelProperty(value = "到仓重量")
private BigDecimal checkWeight;
public void setExceptionReason(String exceptionReason) {
this.exceptionReason = exceptionReason;
if (StringUtils.isNotBlank(exceptionReason) && Objects.nonNull(this.lang)) {
......
......@@ -39,6 +39,8 @@ public enum CustomDraweeEnum {
documentDeclarationFee("documentDeclarationFee","单证报关费","Document customs declaration fee",14),
warehouseRent("warehouseRent","仓租费","Warehouse rental fee",15),
magneticInspectionFee("magneticInspectionFee","磁检费","Magnetic inspection fee",16),
additionalTaxFee("additionalTaxFee","附加税","Additional Tax",17),
// TODO 待补充...
......
......@@ -15,6 +15,7 @@ public enum OrderNumberEnum {
RECEIPT_NO(3, "收款单号"),
PAYMENT_NO(3, "付款单号"),
COMMISSION_PAYMENT_NO(5, "佣金付款单号"),
FOLLOWUP_NO(6, "跟进单号"),
;
/**
* 类型
......
......@@ -398,4 +398,24 @@ public interface OrderBusinessService extends IService<OrderDO> {
void updateItem(OrderItemDO orderItemDO);
/**
* 订单到仓更新
*
* @param orderId 订单ID
* @param checkNum 到仓箱数
* @param checkQuantity 到仓数量
* @param checkVolume 到仓体积
* @param checkWeight 到仓重量
*/
void orderToWarehouse(Long orderId, Integer checkNum, Integer checkQuantity, BigDecimal checkVolume, BigDecimal checkWeight);
/**
* 撤销到仓
*
* @param orderId 订单id
*/
void revokeToWarehouse(Long orderId);
}
......@@ -107,6 +107,8 @@ import static cn.iocoder.yudao.framework.apollo.core.constants.Constants.NOT_ACC
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.ecw.enums.ErrorCodeConstants.EXCHANGE_RATE_NOT_EXISTS_PARAM;
import static cn.iocoder.yudao.module.order.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.order.enums.OrderAirTimeEnum.AIR_UNLOADED_CABINET;
import static cn.iocoder.yudao.module.order.enums.OrderSeaTimeEnum.SEA_UNLOADED_CABINET;
/**
* 订单 Service 实现类
......@@ -2623,7 +2625,7 @@ public class OrderBusinessServiceImpl extends AbstractService<OrderMapper, Order
null,
CollectionUtil.newArrayList(OrderExceptionEnum.LINE_WEIGHT_EXCEPTION.getKey()));
if (CollectionUtil.isNotEmpty(lineOverweightExceptionDOList) ||
lineOverweightExceptionDOList.isEmpty()){
lineOverweightExceptionDOList.isEmpty()) {
overweightExceptionDOList.addAll(lineOverweightExceptionDOList);
}
orderDO.setIsAutomaticHandleNoCanShipmentChannelException(false);
......@@ -2638,7 +2640,7 @@ public class OrderBusinessServiceImpl extends AbstractService<OrderMapper, Order
orderItemDO.getProdId(),
CollectionUtil.newArrayList(OrderExceptionEnum.GOODS_OVERWEIGHT_EXCEPTION.getKey()));
if (CollectionUtil.isNotEmpty(goodsOverweightExceptionDOList) ||
goodsOverweightExceptionDOList.isEmpty()){
goodsOverweightExceptionDOList.isEmpty()) {
overweightExceptionDOList.addAll(goodsOverweightExceptionDOList);
}
//生成未报价异常 (草稿订单除外)
......@@ -2769,7 +2771,6 @@ public class OrderBusinessServiceImpl extends AbstractService<OrderMapper, Order
}
private void airShipmentStateUpdate(Integer type,
List<FeeDto> newFeeDtoList,
OrderDO newOrder) {
......@@ -4039,4 +4040,85 @@ public class OrderBusinessServiceImpl extends AbstractService<OrderMapper, Order
orderItemMapper.updateById(orderItemDO);
}
@Override
public void orderToWarehouse(Long orderId, Integer checkNum, Integer checkQuantity, BigDecimal checkVolume, BigDecimal checkWeight) {
OrderDO orderDO = orderMapper.getOrderById(orderId);
Integer orgCheckNum = orderDO.getCheckNum();
Integer orgCheckQuantity = orderDO.getCheckQuantity();
BigDecimal orgCheckVolume = orderDO.getCheckVolume();
BigDecimal orgCheckWeight = orderDO.getCheckWeight();
// 更新订单到仓数据
orderMapper.update(null, new LambdaUpdateWrapper<OrderDO>()
.set(OrderDO::getCheckNum, checkNum)
.set(OrderDO::getCheckQuantity, checkQuantity)
.set(OrderDO::getCheckVolume, checkVolume)
.set(OrderDO::getCheckWeight, checkWeight)
.eq(OrderDO::getOrderId, orderId)
);
// 添加订单到仓操作日志
List<ApplyInfoVO> list = new ArrayList<>();
ApplyInfoVO applyInfoVO = new ApplyInfoVO();
applyInfoVO.setName("卸柜/到仓箱数");
applyInfoVO.setOrgValue(orgCheckNum + "箱");
applyInfoVO.setNewValue(checkNum + "箱");
list.add(applyInfoVO);
applyInfoVO = new ApplyInfoVO();
applyInfoVO.setName("卸柜/到仓数量");
applyInfoVO.setOrgValue(orgCheckQuantity + "个");
applyInfoVO.setNewValue(checkQuantity + "个");
list.add(applyInfoVO);
applyInfoVO = new ApplyInfoVO();
applyInfoVO.setName("卸柜/到仓体积");
applyInfoVO.setOrgValue(orgCheckVolume + "m³");
applyInfoVO.setNewValue(checkVolume + "m³");
list.add(applyInfoVO);
applyInfoVO = new ApplyInfoVO();
applyInfoVO.setName("卸柜/到仓重量");
applyInfoVO.setOrgValue(orgCheckWeight + "kg");
applyInfoVO.setNewValue(checkWeight + "kg");
list.add(applyInfoVO);
this.addOrderOperateLog(orderId, "订单操作", "订单卸柜/到仓数据更新", list);
}
@Override
public void revokeToWarehouse(Long orderId) {
OrderDO orderDO = orderMapper.getOrderById(orderId);
Integer orgCheckNum = orderDO.getCheckNum();
Integer orgCheckQuantity = orderDO.getCheckQuantity();
BigDecimal orgCheckVolume = orderDO.getCheckVolume();
BigDecimal orgCheckWeight = orderDO.getCheckWeight();
Integer orderStatus = orderDO.getStatus();
Integer orderInWarehouseState = orderDO.getInWarehouseState();
Integer orderShipmentState = orderDO.getShipmentState();
// 更新订单到仓数据,回滚订单状态
orderMapper.update(null, new LambdaUpdateWrapper<OrderDO>()
.set(OrderDO::getCheckNum, 0)
.set(OrderDO::getCheckQuantity, 0)
.set(OrderDO::getCheckVolume, 0)
.set(OrderDO::getCheckWeight, 0)
.set(OrderDO::getUnloadTime, null)
.set(OrderDO::getStatus, 15)
.set(OrderDO::getOldStatus, orderStatus)
.set(OrderDO::getInWarehouseState, 0)
.set(OrderDO::getOldInWarehouseState, orderInWarehouseState)
.set(OrderDO::getShipmentState, 330) // 回滚为已清关,待卸柜/到仓
.set(OrderDO::getOldShipmentState, orderShipmentState)
.eq(OrderDO::getOrderId, orderId)
);
// 回滚订单动态日志
OrderTimeDO orderTimeDO = orderTimeMapper.selectOne(new LambdaQueryWrapper<OrderTimeDO>()
.eq(OrderTimeDO::getOrderId, orderId)
.eq(OrderTimeDO::getStatus, orderDO.getTransportId() == 1 ? SEA_UNLOADED_CABINET.getValue() : AIR_UNLOADED_CABINET.getValue())
.orderByDesc(OrderTimeDO::getId)
.last("limit 1")
);
if (Objects.nonNull(orderTimeDO)) {
orderTimeMapper.deleteById(orderTimeDO.getId());
}
// 添加订单到仓操作日志
this.addOrderOperateLog(orderId, "订单操作", "撤销订单卸柜/到仓,清空到仓数据", "");
}
}
......@@ -545,6 +545,17 @@ public class OrderBackPageVO {
private String customerServiceName;
// -----------end -----------
@ApiModelProperty(value = "到仓件数")
private Integer checkNum;
@ApiModelProperty(value = "到仓数量")
private Integer checkQuantity;
@ApiModelProperty(value = "到仓体积")
private BigDecimal checkVolume;
@ApiModelProperty(value = "到仓重量")
private BigDecimal checkWeight;
public void setGuanLianOrderStatus(String guanLianOrderStatus) {
......
......@@ -647,6 +647,17 @@ public class OrderBackVO {
@ApiModelProperty(value = "放货箱数")
private Integer releaseNum;
@ApiModelProperty(value = "到仓件数")
private Integer checkNum;
@ApiModelProperty(value = "到仓数量")
private Integer checkQuantity;
@ApiModelProperty(value = "到仓体积")
private BigDecimal checkVolume;
@ApiModelProperty(value = "到仓重量")
private BigDecimal checkWeight;
public void setExternalWarehouseJson(String externalWarehouseJson) {
this.externalWarehouseJson = externalWarehouseJson;
......
......@@ -389,6 +389,19 @@ public class OrderBaseVO {
@ApiModelProperty(value = "是否有收货人,1-是,0-否")
private Boolean hasConsignee = true;
@ApiModelProperty(value = "到仓件数")
private Integer checkNum;
@ApiModelProperty(value = "到仓数量")
private Integer checkQuantity;
@ApiModelProperty(value = "到仓体积")
private BigDecimal checkVolume;
@ApiModelProperty(value = "到仓重量")
private BigDecimal checkWeight;
public void setExceptionReason(String exceptionReason) {
this.exceptionReason = StringUtils.isNotBlank(exceptionReason) ? I18nMessage.getMessage(exceptionReason) : exceptionReason;
}
......
......@@ -238,7 +238,7 @@ public class RewardServiceImpl extends AbstractService<RewardMapper, RewardDO> i
}
//提货点id,领取方式,状态
lambdaQuery.eqIfPresent(RewardDO::getNodeId, query.getNodeId())
.eq(StringUtils.isNotBlank(query.getPickMethod()), RewardDO::getPickMethod, query.getPickMethod())
.likeIfPresent(RewardDO::getPickMethod, query.getPickMethod())
.eqIfPresent(RewardDO::getStatus, query.getStatus());
//判断memberId,筛选会员所在城市网点礼品
if (query.getMemberId() != null && query.getNodeId() == null) {
......
......@@ -8,6 +8,8 @@ import java.util.*;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import javax.validation.constraints.NotNull;
/**
* 报价单管理 DO
......@@ -70,6 +72,9 @@ public class OfferDO extends BaseDO {
* 始发地信息
*/
private String departure;
@ApiModelProperty(value = "目的地国ID")
private Long destCountryId;
/**
* 目的地
*/
......
......@@ -65,5 +65,7 @@ public interface ErrorCodeConstants {
ErrorCode ORDER_ASSOCIATION_OFFER_NO_CAN_UPDATE = new ErrorCode(1004010052, "order.association.offer.no.can.update");
ErrorCode ORDER_BOUND_OFFER = new ErrorCode(1004010053, "order.bound.offer");
ErrorCode OFFER_LINE_NOT_EXIST = new ErrorCode(1004010054, "line.not.exist");
ErrorCode OFFER_DEPARTURE_OBJECTIVE_AND_LINE_NOT_AGREEMENT = new ErrorCode(1004010055, "offer.departure.objective.and.line.not.agreement");
}
......@@ -209,6 +209,18 @@ public class OfferServiceImpl extends AbstractService<OfferMapper, OfferDO> impl
if (Objects.nonNull(createReqVO.getEstCostVO())) {
offer.setEstCost(JSONObject.toJSONString(createReqVO.getEstCostVO()));
}
LogisticsInfoDto logisticsInfoDto =
warehouseLineMapper.getStartInfoAndDestInfoByLineId(
createReqVO.getLineId());
if (Objects.isNull(logisticsInfoDto)) {
throw exception(OFFER_LINE_NOT_EXIST);
}
if (!Objects.equals(logisticsInfoDto.getStartCityId(),
createReqVO.getDepartureId()) || !Objects.equals(
logisticsInfoDto.getDestCityId(), createReqVO.getObjectiveId()) || !Objects.equals(
logisticsInfoDto.getDestCountryId(), createReqVO.getDestCountryId())) {
throw exception(OFFER_DEPARTURE_OBJECTIVE_AND_LINE_NOT_AGREEMENT);
}
// offer.setStatus(2);// 确认中
// 查询始发地与目的地信息
RegionDO departure = regionService.getRegion(offer.getDepartureId());
......@@ -534,6 +546,18 @@ public class OfferServiceImpl extends AbstractService<OfferMapper, OfferDO> impl
if (Objects.nonNull(updateReqVO.getEstCostVO())) {
updateObj.setEstCost(JSONObject.toJSONString(updateReqVO.getEstCostVO()));
}
LogisticsInfoDto logisticsInfoDto =
warehouseLineMapper.getStartInfoAndDestInfoByLineId(
updateReqVO.getLineId());
if (Objects.isNull(logisticsInfoDto)) {
throw exception(OFFER_LINE_NOT_EXIST);
}
if (!Objects.equals(logisticsInfoDto.getStartCityId(),
updateReqVO.getDepartureId()) || !Objects.equals(
logisticsInfoDto.getDestCityId(), updateReqVO.getObjectiveId()) || !Objects.equals(
logisticsInfoDto.getDestCountryId(), updateReqVO.getDestCountryId())) {
throw exception(OFFER_DEPARTURE_OBJECTIVE_AND_LINE_NOT_AGREEMENT);
}
// 查询始发地与目的地信息
RegionDO departure = regionService.getRegion(updateReqVO.getDepartureId());
if (Objects.isNull(departure) || (!StrUtil.equals(departure.getType(), "2") && !StrUtil.equals(departure.getType(), "3"))) {
......@@ -642,7 +666,12 @@ public class OfferServiceImpl extends AbstractService<OfferMapper, OfferDO> impl
if (CollectionUtil.isEmpty(offerProdDOList)) {
throw exception(OFFER_PROD_NOT_NULL);
}
respVO.setOfferProdRespVOList(OfferProdConvert.INSTANCE.convertList(offerProdDOList));
LogisticsInfoDto logisticsInfoDto =
warehouseLineMapper.getStartInfoAndDestInfoByLineId(
respVO.getLineId());
respVO.setLogisticsInfoDto(logisticsInfoDto);
return respVO;
}
......@@ -947,6 +976,7 @@ public class OfferServiceImpl extends AbstractService<OfferMapper, OfferDO> impl
createReqVO.setType(offerDO.getServiceType());
createReqVO.setChannelId(channelId);
createReqVO.setLineId(lineId);
createReqVO.setType(offerDO.getServiceType());
createReqVO.setTransportId(offerDO.getTransportId());
createReqVO.setShippingCompany(offerTransportDO.getShippingCompany());
createReqVO.setAirlineCompany(offerTransportDO.getAirlineCompany());
......
......@@ -60,6 +60,10 @@ public class OfferBaseVO {
@NotNull(message = "objective.not.exists")
private Long objectiveId;
@ApiModelProperty(value = "目的地国ID")
@NotNull(message = "目的国不能为空")
private Long destCountryId;
// @ApiModelProperty(value = "目的地信息")
// private String objective;
......
......@@ -174,6 +174,9 @@ public class OfferPageReqVO extends PageParam {
@ApiModelProperty(value = "目的地id集合")
private List<Long> objectiveIds;
@ApiModelProperty(value = "目的仓ID集合")
private List<Long> startWarehouseIds;
@ApiModelProperty(value = "目的仓ID集合")
private List<Long> destWarehouseIds;
......
package cn.iocoder.yudao.module.sale.vo.offer;
import cn.iocoder.yudao.module.depository.dto.LogisticsInfoDto;
import cn.iocoder.yudao.module.sale.vo.offer.prod.OfferProdRespVO;
import cn.iocoder.yudao.module.sale.vo.offer.transport.OfferTransportCreateReqVO;
import cn.iocoder.yudao.module.sale.vo.offer.transport.OfferTransportRespVO;
......@@ -32,7 +33,10 @@ public class OfferRespVO extends OfferBaseVO {
private OfferTransportRespVO transportVO;
@ApiModelProperty(value = "报价单商品列表")
List<OfferProdRespVO> offerProdRespVOList;
private List<OfferProdRespVO> offerProdRespVOList;
@ApiModelProperty(value = "物流信息")
private LogisticsInfoDto logisticsInfoDto;
@ApiModelProperty(value = "始发地名称")
private String departureName;
......@@ -59,10 +63,14 @@ public class OfferRespVO extends OfferBaseVO {
// 线路相关
@ExcelProperty("始发仓库id")
@ApiModelProperty("始发仓库id")
private Long startWarehouseId;
@ExcelProperty("目的仓库id")
@ApiModelProperty("始发仓库名称")
private String startWarehouseName;
@ApiModelProperty("目的仓库id")
private Long destWarehouseId;
@ApiModelProperty("目的仓库名称")
private String destWarehouseName;
@ExcelProperty("运输方式")
private String transportType;
......
......@@ -3763,7 +3763,7 @@ public class BoxServiceImpl extends AbstractService<BoxMapper, BoxDO> implements
//看看收货人是否是送货上门
OrderConsigneeBackVO orderConsigneeDO = backVO.getConsigneeVO();
//送货方式,2-送货上门
Integer harvestMethod = orderConsigneeDO.getHarvestMethod();
Integer harvestMethod = Objects.nonNull(orderConsigneeDO) && Objects.nonNull(orderConsigneeDO.getHarvestMethod()) ? orderConsigneeDO.getHarvestMethod() : backVO.getHarvestMethod();
if (harvestMethod == null || harvestMethod != 2) continue;
//创建订单异常
......
......@@ -221,6 +221,9 @@ yudao:
send-maximum-quantity-per-day: 50
begin-code: 9999 # 验证码最小值
end-code: 9999 # 验证码最大值。
member: # 会员相关配置
register-url: https://apptest.groupage.cn/#/pages/register/shareRegister?code=
share-url: https://apptest.groupage.cn/#
justauth:
enabled: true
......
......@@ -225,6 +225,9 @@ yudao:
send-maximum-quantity-per-day: 50
begin-code: 9999 # 验证码最小值
end-code: 9999 # 验证码最大值。
member: # 会员相关配置
register-url: https://applocal.groupage.cn/#/pages/register/shareRegister?code=
share-url: https://applocal.groupage.cn/#
justauth:
enabled: true
......
......@@ -217,6 +217,9 @@ yudao:
send-maximum-quantity-per-day: 50
begin-code: 1000 # 验证码最小值
end-code: 9999 # 验证码最大值。
member: # 会员相关配置
register-url: https://app2.groupage.cn/#/pages/register/shareRegister?code=
share-url: https://app2.groupage.cn/#
justauth:
enabled: true
......
This diff is collapsed.
......@@ -42,14 +42,14 @@ spring:
primary: master
datasource:
master:
name: jiedao01
name: jd
url: jdbc:mysql://172.16.0.3:3306/${spring.datasource.dynamic.datasource.master.name}?useUnicode=true&useSSL=true&characterEncoding=utf8&characterSetResults=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&autoReconnect=true&rewriteBatchedStatements=TRUE
driver-class-name: com.mysql.cj.jdbc.Driver
username: jd
password: Jd2024
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
name: jd
url: jdbc:mysql://10.10.0.13:3306/${spring.datasource.dynamic.datasource.slave.name}?useUnicode=true&useSSL=true&characterEncoding=utf8&characterSetResults=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&autoReconnect=true&rewriteBatchedStatements=TRUE
url: jdbc:mysql://172.16.0.3:3306/${spring.datasource.dynamic.datasource.slave.name}?useUnicode=true&useSSL=true&characterEncoding=utf8&characterSetResults=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&autoReconnect=true&rewriteBatchedStatements=TRUE
driver-class-name: com.mysql.cj.jdbc.Driver
username: jd
password: Jd2024
......@@ -217,6 +217,9 @@ yudao:
send-maximum-quantity-per-day: 50
begin-code: 9999 # 验证码最小值
end-code: 9999 # 验证码最大值。
member: # 会员相关配置
register-url: https://apptest.groupage.cn/#/pages/register/shareRegister?code=
share-url: https://apptest.groupage.cn/#
justauth:
enabled: true
......
......@@ -218,6 +218,9 @@ yudao:
send-maximum-quantity-per-day: 50
begin-code: 9999 # 验证码最小值
end-code: 9999 # 验证码最大值。
member: # 会员相关配置
register-url: https://apptest.groupage.cn/#/pages/register/shareRegister?code=
share-url: https://apptest.groupage.cn/#
justauth:
enabled: true
......
......@@ -645,7 +645,9 @@ order.cargo.control.cancel.pick.reject=The release record of the control order i
order.cargo.control.cancel.pick.cancel=The release record of the control order has been cancelled
warehouse.in.item.quantity.required=warehouse in item quantity required
order.line.not.exist=Order line does not exist
line.not.exist=The line does not exist
order.departure.objective.and.line.not.agreement=The order origin destination is inconsistent with the route
offer.departure.objective.and.line.not.agreement=The offer origin destination is inconsistent with the route
transport.and.line.not.agreement=The shipping method of the order does not match the route information. Please reselect the route information
prod.brand.not.null=brand is not null or zero
preload.not.exist=Goods are not pre-loaded in the shipment order
......
......@@ -651,7 +651,9 @@ order.cargo.control.cancel.pick.reject=\u63A7\u8D27\u8BA2\u5355\u5DF2\u653E\u8D2
order.cargo.control.cancel.pick.cancel=\u63A7\u8D27\u8BA2\u5355\u5DF2\u653E\u8D27\u8BB0\u5F55\u8C03\u8D27\u5BA1\u6279\u53D6\u6D88
warehouse.in.item.quantity.required=\u5165\u4ED3\u9879\u6570\u91CF\u5FC5\u586B
order.line.not.exist=\u8BA2\u5355\u7EBF\u8DEF\u4E0D\u5B58\u5728
line.not.exist=\u7ebf\u8def\u4e0d\u5b58\u5728
order.departure.objective.and.line.not.agreement=\u8BA2\u5355\u59CB\u53D1\u5730\u76EE\u7684\u5730\u4E0E\u7EBF\u8DEF\u4E0D\u4E00\u81F4
offer.departure.objective.and.line.not.agreement=\u62a5\u4ef7\u5355\u59cb\u53d1\u5730\u76ee\u7684\u5730\u4e0e\u7ebf\u8def\u4e0d\u4e00\u81f4
transport.and.line.not.agreement=\u8BA2\u5355\u8FD0\u8F93\u65B9\u5F0F\u4E0E\u7EBF\u8DEF\u4FE1\u606F\u4E0D\u5339\u914D\uFF0C\u8BF7\u91CD\u65B0\u9009\u62E9\u7EBF\u8DEF\u4FE1\u606F
prod.brand.not.null=\u54C1\u724C\u4E0D\u80FD\u4E3A\u7A7A\u62160
preload.not.exist=\u51FA\u8D27\u5355\u672A\u9884\u88C5\u8D27\u7269
......
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