Commit 4e60adf3 authored by zhengyi's avatar zhengyi

Merge branch 'test' into release

parents 6a7d4af9 199c4434
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
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
......@@ -95,6 +95,7 @@ public enum WorkFlowEmus {
SHIPMENT_LINE_WEIGHT_ALLOW_OVER("shipment_line_weight_allow_over", "出货审批-允许超出线路重量上限审核"),
ORDER_OVERSEAS_WAREHOUSE_CHANGE("order_overseas_warehouse_change", "订单审批-海外仓修改申请"),
ORDER_CONSIGNEE_LIMIT_CHANGE("order_consignee_limit_change", "订单审批-收货人限制修改申请"),
ORDER_WAREHOUSING("order_warehousing", "订单审批-入仓申请"),
;
private String key;
private String value;
......
package cn.iocoder.yudao.module.bpm.service.order.listener;
import cn.iocoder.yudao.module.bpm.enums.WorkFlowEmus;
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEvent;
import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventListener;
import cn.iocoder.yudao.module.order.service.order.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
@Slf4j
public class BmpOrderWarehouseingResultListener extends BpmProcessInstanceResultEventListener {
@Resource
OrderService orderService;
@Override
protected String getProcessDefinitionKey() {
return WorkFlowEmus.ORDER_WAREHOUSING.getKey();
}
@Override
protected void onEvent(BpmProcessInstanceResultEvent event) {
log.info("----------------------入仓申请----------------------,{},{}" + event.getBusinessKey(), event.getResult());
//orderService.approvalOrder(event.getBusinessKey(), event.getResult());
}
}
......@@ -1536,7 +1536,7 @@
in_time,
if(#{query.userType} = 1, 1, 2) as user_type,
nor.customer_id as consignor_customer_id,
if(nor.customer_id != null and nor.customer_id > 0,
if(nor.customer_id is not null and nor.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nor.customer_id),
"") as consignor_follow_customerService,
nor.customer_number as consignor_customer_number,
......@@ -1545,7 +1545,7 @@
nor.phone as consignor_phone,
nor.country_code as consignor_country_code,
nee.customer_id as consignee_customer_id,
if(nee.customer_id != null and nee.customer_id > 0,
if(nee.customer_id is not null and nee.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nee.customer_id),
"") as consignee_follow_customerService,
nee.customer_number as consignee_customer_number,
......@@ -1682,7 +1682,7 @@
in_time,
if(#{query.userType} = 1, 1, 2) as user_type,
nor.customer_id as consignor_customer_id,
if(nor.customer_id != null and nor.customer_id > 0,
if(nor.customer_id is not null and nor.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nor.customer_id),
"") as consignor_follow_customerService,
nor.customer_number as consignor_customer_number,
......@@ -1691,7 +1691,7 @@
nor.phone as consignor_phone,
nor.country_code as consignor_country_code,
nee.customer_id as consignee_customer_id,
if(nee.customer_id != null and nee.customer_id > 0,
if(nee.customer_id is not null and nee.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nee.customer_id),
"") as consignee_follow_customerService,
nee.customer_number as consignee_customer_number,
......@@ -4493,7 +4493,7 @@
in_time,
if(#{query.userType} = 1, 1, 2) as user_type,
nor.customer_id as consignor_customer_id,
if(nor.customer_id != null and nor.customer_id > 0,
if(nor.customer_id is not null and nor.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nor.customer_id),
"") as consignor_follow_customerService,
nor.customer_number as consignor_customer_number,
......@@ -4502,7 +4502,7 @@
nor.phone as consignor_phone,
nor.country_code as consignor_country_code,
nee.customer_id as consignee_customer_id,
if(nee.customer_id != null and nee.customer_id > 0,
if(nee.customer_id is not null and nee.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nee.customer_id),
"") as consignee_follow_customerService,
nee.customer_number as consignee_customer_number,
......@@ -4619,7 +4619,7 @@
in_time,
if(#{query.userType} = 1, 1, 2) as user_type,
nor.customer_id as consignor_customer_id,
if(nor.customer_id != null and nor.customer_id > 0,
if(nor.customer_id is not null and nor.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nor.customer_id),
"") as consignor_follow_customerService,
nor.customer_number as consignor_customer_number,
......@@ -4628,7 +4628,7 @@
nor.phone as consignor_phone,
nor.country_code as consignor_country_code,
nee.customer_id as consignee_customer_id,
if(nee.customer_id != null and nee.customer_id > 0,
if(nee.customer_id is not null and nee.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nee.customer_id),
"") as consignee_follow_customerService,
nee.customer_number as consignee_customer_number,
......@@ -4771,7 +4771,7 @@
in_time,
if(#{query.userType} = 1, 1, 2) as user_type,
nor.customer_id as consignor_customer_id,
if(nor.customer_id != null and nor.customer_id > 0,
if(nor.customer_id is not null and nor.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nor.customer_id),
"") as consignor_follow_customerService,
nor.customer_number as consignor_customer_number,
......@@ -4780,7 +4780,7 @@
nor.phone as consignor_phone,
nor.country_code as consignor_country_code,
nee.customer_id as consignee_customer_id,
if(nee.customer_id != null and nee.customer_id > 0,
if(nee.customer_id is not null and nee.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nee.customer_id),
"") as consignee_follow_customerService,
nee.customer_number as consignee_customer_number,
......@@ -4909,7 +4909,7 @@
in_time,
if(#{query.userType} = 1, 1, 2) as user_type,
nor.customer_id as consignor_customer_id,
if(nor.customer_id != null and nor.customer_id > 0,
if(nor.customer_id is not null and nor.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nor.customer_id),
"") as consignor_follow_customerService,
nor.customer_number as consignor_customer_number,
......@@ -4918,7 +4918,7 @@
nor.phone as consignor_phone,
nor.country_code as consignor_country_code,
nee.customer_id as consignee_customer_id,
if(nee.customer_id != null and nee.customer_id > 0,
if(nee.customer_id is not null and nee.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nee.customer_id),
"") as consignee_follow_customerService,
nee.customer_number as consignee_customer_number,
......@@ -5016,7 +5016,7 @@
in_time,
if(#{query.userType} = 1, 1, 2) as user_type,
nor.customer_id as consignor_customer_id,
if(nor.customer_id != null and nor.customer_id > 0,
if(nor.customer_id is not null and nor.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nor.customer_id),
"") as consignor_follow_customerService,
nor.customer_number as consignor_customer_number,
......@@ -5025,7 +5025,7 @@
nor.phone as consignor_phone,
nor.country_code as consignor_country_code,
nee.customer_id as consignee_customer_id,
if(nee.customer_id != null and nee.customer_id > 0,
if(nee.customer_id is not null and nee.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nee.customer_id),
"") as consignee_follow_customerService,
nee.customer_number as consignee_customer_number,
......@@ -5136,7 +5136,7 @@
o.is_exception,
o.create_time,
nor.customer_id as consignor_customer_id,
if(nor.customer_id != null and nor.customer_id > 0,
if(nor.customer_id is not null and nor.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nor.customer_id),
"") as consignor_follow_customerService,
nor.customer_number as consignor_customer_number,
......@@ -5145,7 +5145,7 @@
nor.phone as consignor_phone,
nor.country_code as consignor_country_code,
nee.customer_id as consignee_customer_id,
if(nee.customer_id != null and nee.customer_id > 0,
if(nee.customer_id is not null and nee.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nee.customer_id),
"") as consignee_follow_customerService,
nee.customer_number as consignee_customer_number,
......@@ -7073,7 +7073,7 @@
o.create_time,
if(#{query.userType} = 1, 1, 2) as user_type,
nor.customer_id as consignor_customer_id,
if(nor.customer_id != null and nor.customer_id > 0,
if(nor.customer_id is not null and nor.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nor.customer_id),
"") as consignor_follow_customerService,
nor.customer_number as consignor_customer_number,
......@@ -7082,7 +7082,7 @@
nor.phone as consignor_phone,
nor.country_code as consignor_country_code,
nee.customer_id as consignee_customer_id,
if(nee.customer_id != null and nee.customer_id > 0,
if(nee.customer_id is not null and nee.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nee.customer_id),
"") as consignee_follow_customerService,
nee.customer_number as consignee_customer_number,
......@@ -7172,7 +7172,7 @@
o.create_time,
if(#{query.userType} = 1, 1, 2) as user_type,
nor.customer_id as consignor_customer_id,
if(nor.customer_id != null and nor.customer_id > 0,
if(nor.customer_id is not null and nor.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nor.customer_id),
"") as consignor_follow_customerService,
nor.customer_number as consignor_customer_number,
......@@ -7181,7 +7181,7 @@
nor.phone as consignor_phone,
nor.country_code as consignor_country_code,
nee.customer_id as consignee_customer_id,
if(nee.customer_id != null and nee.customer_id > 0,
if(nee.customer_id is not null and nee.customer_id > 0,
(SELECT u1.nickname FROM system_user u1 JOIN system_user u2 on u1.id = u2.customer_service_id JOIN ecw_customer u ON u.customer_service = u2.id WHERE u.id = nee.customer_id),
"") as consignee_follow_customerService,
nee.customer_number as consignee_customer_number,
......
......@@ -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;
/**
* 目的地
*/
......
......@@ -93,39 +93,27 @@ public interface OfferMapper extends BaseMapperX<OfferDO> {
@Select({
"<script>",
"select o.*, ",
// "o.number, ",
// "o.order_no, ",
// "o.order_id, ",
"if(#{lang} = 0, o.departure ->> '$.titleZh', o.departure ->> '$.titleEn') as departure_name, ",
"if(#{lang} = 0, o.objective ->> '$.titleZh', o.objective ->> '$.titleEn') as objective_name, ",
// "o.start_time, ",
// "o.end_time, ",
// "o.stop_time, ",
// "o.status, ",
// "o.transport_id, ",
// "o.est_cost, ",
// "o.create_time, ",
// "o.update_time, ",
"user.number as customer_number, ",
"(select count(1) from ecw_customer_followup l where l.offer_id = o.offer_id) as log_count, ",
"u.nickname as creator_name, ",
"u.nickname as business_manager_name, ",
// "(SELECT cc.`name` FROM ecw_customer_contacts cc WHERE ( o.relation = 1 AND cc.id = o.consignor_id ) OR ( o.relation = 2 AND cc.id = o.consignee_id)) AS relation_name ",
"cc.name as relation_name, ",
"cc.area_code as relation_area_code, ",
"cc.phone_new as relation_phone, ",
"if(#{lang} = 0, l.name_zh , l.name_en ) as channel_name, ",
"line.start_warehouse_id, ",
"line.dest_warehouse_id, ",
"if(#{lang} = 0, st.title_zh , st.title_en) as start_warehouse_name, ",
"if(#{lang} = 0, dst.title_zh , dst.title_en) as dest_warehouse_name, ",
"line.transport_type ",
"from ecw_offer o ",
"left join ecw_customer_contacts cc on (o.relation = 1 and cc.id = o.consignor_id) or (o.relation = 2 and cc.id = o.consignee_id) ",
"left join ecw_customer user on user.id = o.relation_id ",
"join ecw_customer_contacts cc on (o.relation = 1 and cc.id = o.consignor_id) or (o.relation = 2 and cc.id = o.consignee_id) ",
"join ecw_customer user on user.id = o.relation_id ",
"left join system_user u on u.id = o.follow_up_salesman_id ",
"left join ecw_region s on o.objective_id = s.id ",
"left join ecw_warehouse_line line on o.line_id = line.id ",
"left join ecw_warehouse dst on line.dest_warehouse_id = dst.id ",
"join ecw_region s on o.objective_id = s.id ",
"join ecw_warehouse_line line on o.line_id = line.id ",
"join ecw_warehouse st on line.start_warehouse_id = st.id ",
"join ecw_warehouse dst on line.dest_warehouse_id = dst.id ",
"left join ecw_channel l on o.channel_id = l.channel_id ",
"where o.deleted = 0",
......@@ -152,7 +140,6 @@ public interface OfferMapper extends BaseMapperX<OfferDO> {
"AND o.relation_id = #{pageVO.customerId} ",
"</when>",
"<when test = 'pageVO.deptId != null'>",
"AND o.dept_id = #{pageVO.deptId} ",
"</when>",
......@@ -204,23 +191,23 @@ public interface OfferMapper extends BaseMapperX<OfferDO> {
"</when>",
"<when test = 'pageVO.importances != null and pageVO.importances.size() > 0'>",
"AND o.`importance` IN ",
"<foreach item='importance' collection='pageVO.importances' open='(' close=')' separator=','> #{importance} </foreach>)",
"<foreach item='importance' collection='pageVO.importances' open='(' close=')' separator=','> #{importance} </foreach>",
"</when>",
"<when test = 'pageVO.salesmanIds != null and pageVO.salesmanIds.size() > 0'>",
"AND o.`follow_up_salesman_id` IN ",
"<foreach item='id' collection='pageVO.salesmanIds' open='(' close=')' separator=','> #{id} </foreach>)",
"<foreach item='id' collection='pageVO.salesmanIds' open='(' close=')' separator=','> #{id} </foreach>",
"</when>",
"<when test = 'pageVO.statusList != null and pageVO.statusList.size() > 0'>",
"AND o.`status` IN ",
"<foreach item='it' collection='pageVO.statusList' open='(' close=')' separator=','> #{it} </foreach>)",
"<foreach item='it' collection='pageVO.statusList' open='(' close=')' separator=','> #{it} </foreach>",
"</when>",
"<when test = 'pageVO.channelIds != null and pageVO.channelIds.size() > 0'>",
"AND o.`channel_id` IN ",
"<foreach item='it' collection='pageVO.channelIds' open='(' close=')' separator=','> #{it} </foreach>)",
"<foreach item='it' collection='pageVO.channelIds' open='(' close=')' separator=','> #{it} </foreach>",
"</when>",
"<when test = 'pageVO.sourceIds != null and pageVO.sourceIds.size() > 0'>",
"AND user.`source` IN ",
"<foreach item='it' collection='pageVO.sourceIds' open='(' close=')' separator=','> #{it} </foreach>)",
"<foreach item='it' collection='pageVO.sourceIds' open='(' close=')' separator=','> #{it} </foreach>",
"</when>",
"<when test = 'pageVO.beginStopTime != null and pageVO.endStopTime != null '>",
"AND o.`stop_time` between #{pageVO.beginStopTime} and #{pageVO.endStopTime}",
......@@ -254,11 +241,21 @@ public interface OfferMapper extends BaseMapperX<OfferDO> {
"<script>",
"select count(1)",
"from ecw_offer o ",
"left join ecw_customer c on c.id = o.relation_id ",
"left join ecw_region s on o.objective_id = s.id ",
"left join ecw_warehouse_line line on o.line_id = line.id ",
"left join ecw_warehouse dst on line.dest_warehouse_id = dst.id ",
"join ecw_customer_contacts cc on (o.relation = 1 and cc.id = o.consignor_id) or (o.relation = 2 and cc.id = o.consignee_id) ",
"join ecw_customer user on user.id = o.relation_id ",
"left join system_user u on u.id = o.follow_up_salesman_id ",
"join ecw_region s on o.objective_id = s.id ",
"join ecw_warehouse_line line on o.line_id = line.id ",
"join ecw_warehouse st on line.start_warehouse_id = st.id ",
"join ecw_warehouse dst on line.dest_warehouse_id = dst.id ",
"left join ecw_channel l on o.channel_id = l.channel_id ",
"where o.deleted = 0",
//startWarehouseIds
"<when test = 'pageVO.startWarehouseIds != null and pageVO.startWarehouseIds.size() > 0'>",
"AND st.id IN",
"<foreach item='startWarehouseId' collection='pageVO.startWarehouseIds' open='(' close=')' separator=','> #{startWarehouseId} </foreach>",
"</when>",
//destCountryIds
"<when test = 'pageVO.destCountryIds != null and pageVO.destCountryIds.size() > 0'>",
"AND dst.guojia IN",
......@@ -281,6 +278,7 @@ public interface OfferMapper extends BaseMapperX<OfferDO> {
"<when test = 'pageVO.customerId != null'>",
"AND o.relation_id = #{pageVO.customerId} ",
"</when>",
"<when test = 'pageVO.deptId != null'>",
"AND o.dept_id = #{pageVO.deptId} ",
"</when>",
......@@ -327,37 +325,31 @@ public interface OfferMapper extends BaseMapperX<OfferDO> {
"<when test = 'pageVO.beginEndTime != null and pageVO.endEndTime != null '>",
"AND o.`end_time` between #{pageVO.beginEndTime} and #{pageVO.endEndTime}",
"</when>",
"<when test = 'pageVO.beginStopTime != null and pageVO.endStopTime != null '>",
"AND o.`stop_time` between #{pageVO.beginStopTime} and #{pageVO.endStopTime}",
"</when>",
"<when test = 'pageVO.expired != null and pageVO.expired.after != null and pageVO.expired.before != null'>",
"AND o.`end_time` between #{pageVO.expired.after} and #{pageVO.expired.before}",
"</when>",
"<when test = 'pageVO.importances != null and pageVO.importances.size() > 0'>",
"AND o.`importance` IN ",
"<foreach item='importance' collection='pageVO.importances' open='(' close=')' separator=','> #{importance} </foreach>)",
"<foreach item='importance' collection='pageVO.importances' open='(' close=')' separator=','> #{importance} </foreach>",
"</when>",
"<when test = 'pageVO.salesmanIds != null and pageVO.salesmanIds.size() > 0'>",
"AND o.`follow_up_salesman_id` IN ",
"<foreach item='id' collection='pageVO.salesmanIds' open='(' close=')' separator=','> #{id} </foreach>)",
"<foreach item='id' collection='pageVO.salesmanIds' open='(' close=')' separator=','> #{id} </foreach>",
"</when>",
"<when test = 'pageVO.statusList != null and pageVO.statusList.size() > 0'>",
"AND o.`status` IN ",
"<foreach item='it' collection='pageVO.statusList' open='(' close=')' separator=','> #{it} </foreach>)",
"<foreach item='it' collection='pageVO.statusList' open='(' close=')' separator=','> #{it} </foreach>",
"</when>",
"<when test = 'pageVO.channelIds != null and pageVO.channelIds.size() > 0'>",
"AND o.`channel_id` IN ",
"<foreach item='it' collection='pageVO.channelIds' open='(' close=')' separator=','> #{it} </foreach>)",
"<foreach item='it' collection='pageVO.channelIds' open='(' close=')' separator=','> #{it} </foreach>",
"</when>",
"<when test = 'pageVO.sourceIds != null and pageVO.sourceIds.size() > 0'>",
"AND c.`source` IN ",
"<foreach item='it' collection='pageVO.sourceIds' open='(' close=')' separator=','> #{it} </foreach>)",
"</when>",
"<when test = 'pageVO.relationId != null'>",
"AND o.`relation_id` = #{pageVO.relationId}",
"AND user.`source` IN ",
"<foreach item='it' collection='pageVO.sourceIds' open='(' close=')' separator=','> #{it} </foreach>",
"</when>",
"<when test = 'pageVO.followUpSalesmanId != null'>",
"AND o.`follow_up_salesman_id` = #{pageVO.followUpSalesmanId}",
"<when test = 'pageVO.beginStopTime != null and pageVO.endStopTime != null '>",
"AND o.`stop_time` between #{pageVO.beginStopTime} and #{pageVO.endStopTime}",
"</when>",
"<when test = 'pageVO.prodTitle != null and pageVO.prodTitle != \"\" '>",
"and (o.offer_id in(",
......@@ -371,6 +363,9 @@ public interface OfferMapper extends BaseMapperX<OfferDO> {
"<when test = 'pageVO.relationId != null'>",
"AND o.`relation_id` = #{pageVO.relationId}",
"</when>",
"<when test = 'pageVO.followUpSalesmanId != null'>",
"AND o.`follow_up_salesman_id` = #{pageVO.followUpSalesmanId}",
"</when>",
"<when test = 'pageVO.searchCustomer != null and pageVO.searchCustomer != \"\" '>",
"AND o.`relation_id` in(select cc.customer_id from ecw_customer_contacts cc where concat(cc.`name`, cc.phone_new) like concat('%',concat(#{pageVO.searchCustomer},'%')))",
"</when>",
......@@ -400,7 +395,7 @@ public interface OfferMapper extends BaseMapperX<OfferDO> {
"u.nickname as creator_name, ",
"cc.name as relation_name",
"from ecw_offer o ",
"left join ecw_customer_contacts cc on (o.relation = 1 and cc.id = o.consignor_id) or (o.relation = 2 and cc.id = o.consignee_id) ",
"join ecw_customer_contacts cc on (o.relation = 1 and cc.id = o.consignor_id) or (o.relation = 2 and cc.id = o.consignee_id) ",
"left join system_user u on u.id = o.follow_up_salesman_id ",
"where o.deleted = 0",
"AND o.`status` in(1,3,4,5,6)",
......
......@@ -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;
......
......@@ -170,7 +170,7 @@ spring:
logging:
level:
root: INFO
cn.iocoder.yudao: DEBUG
cn.iocoder.yudao: INFO
--- #################### 微信公众号相关配置 ####################
wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
......
server:
port: 9001
--- #################### 数据库相关配置 ####################
spring:
# 数据源配置项
autoconfigure:
exclude:
- com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
datasource:
druid: # Druid 【监控】相关的全局配置
web-stat-filter:
enabled: true
stat-view-servlet:
enabled: true
allow: # 设置白名单,不填则允许所有访问
url-pattern: /druid/*
login-username: # 控制台管理用户名和密码
login-password:
filter:
stat:
enabled: true
log-slow-sql: true # 慢 SQL 记录
slow-sql-millis: 100
merge-sql: true
wall:
config:
multi-statement-allow: true
dynamic: # 多数据源配置
druid: # Druid 【连接池】相关的全局配置
initial-size: 5 # 初始连接数
min-idle: 10 # 最小连接池数量
max-active: 20 # 最大连接池数量
max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
test-while-idle: true
test-on-borrow: false
test-on-return: false
primary: master
datasource:
master:
name: jiedao
url: jdbc:mysql://10.10.0.13: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: root
password: mysql@2022
slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
name: jiedao
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
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: mysql@2022
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
redis:
host: 10.10.0.14 # 地址
port: 6379 # 端口
database: 0 # 数据库索引
password: redis@2022
timeout: 60s
connect-timeout: 60s
redis-limiter:
redis-host: 10.10.0.14 # redis server IP 默认值:127.0.0.1
redis-port: 6379 # redis service 端口 默认值:6379
redis-db: 1 # redis service 数据库 默认值:6379
redis-password: redis@2022 # redis 访问密码 默认值:null
redis-connection-timeout: 2000 # redis 连接超时时间 默认值:2000
redis-pool-max-idle: 50 # redis 连接池最大空闲连接数 默认值:50
redis-pool-min-idle: 10 # redis 连接池最小空闲连接数 默认值: 10
redis-pool-max-wait-millis: -1 # 从连接池中获取连接最大等待时间 默认值: -1
redis-pool-max-total: 200 # 连接池中最大连接数 默认值: 200
redis-key-prefix: #RL # 访问痕迹key值前缀 默认值: #RL
check-action-timeout: 100 # 访问检查动作最大执行时间(单位毫秒) 默认值: 100
enable-dynamical-conf: true # 是否开启动态配置 默认值: false
channel: #RLConfigChannel # 配置变更事件发送channel名称 默认值: #RLConfigChannel
error: '您的请求过于频繁,请稍后再试'
--- #################### 定时任务相关配置 ####################
# Quartz 配置项,对应 QuartzProperties 配置类
spring:
quartz:
auto-startup: true # 测试环境,需要开启 Job
scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName
job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档
org:
quartz:
# Scheduler 相关配置
scheduler:
instanceName: schedulerName
instanceId: AUTO # 自动生成 instance ID
# JobStore 相关配置
jobStore:
# JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162
class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
isClustered: true # 是集群模式
clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒
misfireThreshold: 60000 # misfire 阀值,单位:毫秒。
# 线程池相关配置
threadPool:
threadCount: 25 # 线程池大小。默认为 10 。
threadPriority: 5 # 线程优先级
class: org.quartz.simpl.SimpleThreadPool # 线程池类型
jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置
initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。
--- #################### 配置中心相关配置 ####################
# Apollo 配置中心
apollo:
bootstrap:
enabled: true # 设置 Apollo 在启动阶段生效
eagerLoad:
enabled: true # 设置 Apollo 在日志初始化前生效,可以实现日志的动态级别配置
jdbc: # 自定义的 JDBC 配置项,用于数据库的地址
dao: cn.iocoder.yudao.module.infra.dal.mysql.config.ConfigDAOImpl
url: ${spring.datasource.dynamic.datasource.master.url}
username: ${spring.datasource.dynamic.datasource.master.username}
password: ${spring.datasource.dynamic.datasource.master.password}
--- #################### 服务保障相关配置 ####################
# Lock4j 配置项
lock4j:
acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
# Resilience4j 配置项
resilience4j:
ratelimiter:
instances:
backendA:
limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50
limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500
timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s
register-health-indicator: true # 是否注册到健康监测
--- #################### 监控相关配置 ####################
# Actuator 监控端点的配置项
management:
endpoints:
web:
base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
exposure:
include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
# Spring Boot Admin 配置项
spring:
boot:
admin:
# Spring Boot Admin Client 客户端的相关配置
client:
url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址
instance:
prefer-ip: true # 注册实例时,优先使用 IP
# Spring Boot Admin Server 服务端的相关配置
context-path: /admin # 配置 Spring
# 日志文件配置
logging:
level:
root: INFO
--- #################### 微信公众号相关配置 ####################
wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
mp:
# 公众号配置(必填)
app-id: wx041349c6f39b268b
secret: 5abee519483bc9f8cb37ce280e814bd0
# 存储配置,解决 AccessToken 的跨节点的共享
config-storage:
type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
key-prefix: wx # Redis Key 的前缀 TODO 芋艿:解决下 Redis key 管理的配置
http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
--- #################### 捷道相关配置 ####################
web:
resource: /app/cms/
# 捷道配置项,设置当前项目所有自定义的配置
yudao:
security:
token-header: Authorization
token-timeout: 30d
session-timeout: 30d
mock-enable: true
mock-secret: test
xss:
enable: false
exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系
- ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求
- ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
pay:
pay-notify-url: http://niubi.natapp1.cc/api/pay/order/notify
pay-return-url: http://niubi.natapp1.cc/api/pay/order/return
refund-notify-url: http://niubi.natapp1.cc/api/pay/refund/notify
demo: false # 开启演示模式
business: # 业务运行配置
debug: true # 开启debug模式
sms-code: # 短信验证码相关的配置项
expire-times: 10m
send-frequency: 1m
send-maximum-quantity-per-day: 50
begin-code: 9999 # 这里配置 9999 的原因是,测试方便。
end-code: 9999 # 这里配置 9999 的原因是,测试方便。
email-code: # 邮件相关的配置项
expire-times: 10m # 过期时间
send-frequency: 1m # 邮件发送频率
send-maximum-quantity-per-day: 50
begin-code: 9999 # 验证码最小值
end-code: 9999 # 验证码最大值。
justauth:
enabled: true
type:
GITEE: # Gitee
client-id: ee61f0374a4c6c404a8717094caa7a410d76950e45ff60348015830c519ba5c1
client-secret: 7c044a5671be3b051414db0cf2cec6ad702dd298d2416ba24ceaf608e6fa26f9
ignore-check-redirect-uri: true
DINGTALK: # 钉钉
client-id: dingvrnreaje3yqvzhxg
client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI
ignore-check-redirect-uri: true
WECHAT_ENTERPRISE: # 企业微信
client-id: wwd411c69a39ad2e54
client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw
agent-id: 1000004
ignore-check-redirect-uri: true
cache:
type: REDIS
prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
ue:
root-path: /app/static/uploads #文件存储根目录(可选配置),默认为[classpath:/static]
server-url: /ueditor/jsp/controller #服务器统一请求接口路径(可选配置),默认为[/ueditor/jsp/controller] upload: cn.jasonone.ueditor.upload.LocationFileStorage #文件持久化处理类(可选配置),默认为[cn.jasonone.ueditor.upload.LocationFileStorage]
templates-url: templates
temp-dir: temp
......@@ -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
......
......@@ -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