Commit 878d7a2f authored by Smile's avatar Smile

Merge remote-tracking branch 'origin/jd_dev' into jd_dev

parents 6bdf59b6 fcff3063
......@@ -4,7 +4,7 @@ ALTER TABLE `ecw_bank_account` COLLATE = utf8mb4_general_ci;
ALTER TABLE `ecw_bank_account` ADD COLUMN `ba_country` bigint NULL DEFAULT NULL COMMENT '国家' AFTER `ba_type`;
ALTER TABLE `ecw_bank_account` ADD COLUMN `ba_income_belong` bigint NULL DEFAULT NULL COMMENT '归属' AFTER `ba_country`;
ALTER TABLE `ecw_bank_account` ADD COLUMN `ba_income_belong` int NULL DEFAULT NULL COMMENT '归属' AFTER `ba_country`;
ALTER TABLE `ecw_bank_account` ADD COLUMN `ba_currency` int NULL DEFAULT NULL COMMENT '币种' AFTER `ba_income_belong`;
......@@ -36,6 +36,8 @@ ALTER TABLE `ecw_receipt` ADD COLUMN `invoice_id` bigint NULL DEFAULT NULL COMME
ALTER TABLE `ecw_receipt` ADD COLUMN `generate_path` int NULL DEFAULT 0 COMMENT '生成路径' AFTER `invoice_id`;
ALTER TABLE `ecw_receipt` ADD COLUMN `write_off_diff_main_currency` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '核销误差兑额外费用主币种金额' AFTER `generate_path`;
CREATE TABLE `ecw_receipt_bank_writeoff_range` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`write_off_down` int NOT NULL DEFAULT 10000 COMMENT '核销比例下界(除以100)',
......@@ -48,6 +50,9 @@ CREATE TABLE `ecw_receipt_bank_writeoff_range` (
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '银行收款明细自动核销比例设置表' ROW_FORMAT = DYNAMIC;
INSERT INTO `ecw_receipt_bank_writeoff_range` (`id`, `write_off_down`, `write_off_up`, `create_time`, `update_time`, `creator`, `updater`, `deleted`) VALUES (1, 9999, 10000, '2025-01-20 13:39:44', '2025-01-20 13:39:44', '1', '1', 0);
CREATE TABLE `ecw_receipt_invoice` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`invoice_no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '开票编号',
......@@ -103,6 +108,8 @@ ALTER TABLE `ecw_receipt_item` ADD COLUMN `remark` varchar(500) CHARACTER SET ut
ALTER TABLE `ecw_receipt_item` ADD COLUMN `approval_time` datetime NULL DEFAULT NULL COMMENT '审核通过时间' AFTER `remark`;
ALTER TABLE `ecw_receipt_item` ADD COLUMN `account_id` bigint NULL DEFAULT NULL COMMENT '收款账号id' AFTER `receipt_id`;
ALTER TABLE `ecw_receipt_item` MODIFY COLUMN `rate` decimal(10, 6) NULL DEFAULT NULL COMMENT '收款汇率' AFTER `currency_id`;
CREATE TABLE `ecw_receipt_log` (
......@@ -128,20 +135,29 @@ ALTER TABLE `ecw_receivable` ADD COLUMN `write_off_amount` decimal(15, 2) NOT NU
ALTER TABLE `ecw_receivable` MODIFY COLUMN `exchange_rate` decimal(15, 6) NULL DEFAULT NULL COMMENT '汇率' AFTER `fee_type`;
ALTER TABLE `ecw_receivable` ADD COLUMN `dest_country_currency_id` bigint NULL DEFAULT NULL COMMENT '目的国相关币种id(用于报表,跟费用类型相关)' AFTER `fee_type`;
ALTER TABLE `ecw_receivable` ADD COLUMN `dest_country_rate` decimal(10, 6) NULL DEFAULT NULL COMMENT '目的国相关汇率(用于报表,跟费用类型相关)' AFTER `dest_country_currency_id`;
ALTER TABLE `ecw_receivable` ADD COLUMN `dest_country_sub_rate` decimal(10, 6) NULL DEFAULT NULL COMMENT '额外费用副币种汇率(用于报表,跟费用类型相关)' AFTER `dest_country_rate`;
ALTER TABLE `ecw_receivable` ADD INDEX `key_receipt_id`(`deleted` ASC, `receipt_id` ASC) USING BTREE;
CREATE TABLE `ecw_receivable_write_off_record` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`order_id` bigint DEFAULT NULL COMMENT '订单id',
`receivable_id` bigint DEFAULT NULL COMMENT '应收款id',
`receipt_item_id` bigint DEFAULT NULL COMMENT '银行收款明细id',
`receivable_write_off_amount` decimal(10,2) DEFAULT NULL COMMENT '应收的核销金额',
`write_off_amount` decimal(10,2) DEFAULT NULL COMMENT '核销金额',
`income_belong` int DEFAULT NULL COMMENT '收入归属(0目的国,1始发国)',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`creator` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '创建人',
`updater` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '更新人',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '删除标志',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='收款单日志';
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='收款明细与应收明细关联表';
SET FOREIGN_KEY_CHECKS=1;
......
......@@ -28,6 +28,67 @@ UPDATE ecw_receipt_item
SET approval_time = update_time
WHERE approval_time IS NULL AND `status` = 1;
# 刷新银行明细汇率,银行收款明细-币种≠应收所在自编号对应的核算币种,但是跟收款单-应收费用的币种相同
UPDATE ecw_receipt_item eri
SET eri.rate = (
SELECT era.write_off_rate
FROM ecw_receipt_account era
WHERE eri.receipt_id = era.receipt_id
AND era.currency_id = eri.currency_id
AND era.deleted = 0
AND era.write_off_rate IS NOT NULL
)
WHERE eri.`status` = 1
AND eri.deleted = 0
AND EXISTS (
SELECT 1
FROM ecw_receipt_account era
WHERE eri.receipt_id = era.receipt_id
AND era.currency_id = eri.currency_id
AND era.deleted = 0
AND era.write_off_rate IS NOT NULL
);
# 查询银行收款明细-币种≠应收所在自编号对应的核算币种,跟收款单-应收费用的币种也无法匹配
SELECT
eri.id,
eri.serial_number,
eri.receipt_id,
era.id aid,
eri.currency_id ic,
era.currency_id ac,
era.write_off_rate
FROM
ecw_receipt_item eri
LEFT JOIN ecw_receipt_account era ON eri.receipt_id = era.receipt_id
AND eri.currency_id = era.currency_id
AND era.deleted = 0
WHERE
eri.`status` = 1
AND eri.deleted = 0
AND era.id IS NULL;
# 刷新银行收款明细-币种≠应收所在自编号对应的核算币种,跟收款单-应收费用的币种也无法匹配
UPDATE ecw_receipt_item eri
JOIN (
SELECT
eri.id
FROM
ecw_receipt_item eri
LEFT JOIN ecw_receipt_account era
ON eri.receipt_id = era.receipt_id
AND eri.currency_id = era.currency_id
AND era.deleted = 0
WHERE
eri.`status` = 1
AND eri.deleted = 0
AND era.id IS NULL
) AS to_update ON eri.id = to_update.id
SET eri.rate = IFNULL((
SELECT eer.currency_rate
FROM ecw_exchange_rate eer
WHERE eer.source_currency_id = eri.currency_id
AND eer.target_currency_id = eri.write_off_currency_id
),1);
# 刷新银行明细审核核销币种
UPDATE ecw_receipt_item SET write_off_currency_id = 1 WHERE write_off_currency_id IS NULL;
......@@ -38,12 +99,20 @@ UPDATE ecw_receivable er
SET er.discount_total = 0 WHERE er.discount_total IS NULL;
# 刷新应收款汇率
# 应收明细币种=基准币种
UPDATE ecw_receivable er
SET er.exchange_rate = 1 WHERE er.exchange_rate IS NULL AND er.receipt_id IS NOT NULL AND er.currency_id = er.base_currency_id AND er.deleted = 0;
# 应收明细基准币种是美元
UPDATE ecw_receivable er
SET er.exchange_rate = ( SELECT era.write_off_rate FROM ecw_receipt_account era WHERE era.receipt_id = er.receipt_id AND era.currency_id = er.currency_id AND era.deleted = 0)
WHERE
er.receipt_id IS NOT NULL AND er.base_currency_id = 1 AND er.deleted = 0;
# 应收明细基准币种不是美元
UPDATE ecw_receivable er
SET er.exchange_rate = (SELECT eer.currency_rate FROM ecw_exchange_rate eer WHERE eer.source_currency_id = er.currency_id AND eer.target_currency_id = er.base_currency_id )
WHERE er.exchange_rate IS NULL AND er.receipt_id IS NOT NULL;
WHERE er.exchange_rate IS NULL AND er.receipt_id IS NOT NULL AND er.base_currency_id != 1 AND er.deleted = 0;
UPDATE ecw_receivable er
SET er.exchange_rate = 1 WHERE er.exchange_rate IS NULL AND er.receipt_id IS NOT NULL;
# 刷新应收款基准金额
UPDATE ecw_receivable er
......@@ -51,4 +120,12 @@ SET er.base_amount = er.exchange_rate * (er.tax_amount - er.discount_total)
WHERE er.base_amount IS NULL AND er.receipt_id IS NOT NULL AND er.exchange_rate IS NOT NULL;
# 修改收款单已核销待开票状态
UPDATE `ecw_receipt` SET `state` = 4 WHERE `state` = 5;
\ No newline at end of file
UPDATE `ecw_receipt` SET `state` = 4 WHERE `state` = 5;
# 刷新应收明细账户ID
UPDATE ecw_receipt_item eri SET eri.account_id = (SELECT eba.id FROM ecw_bank_account eba WHERE eba.ba_account_name = eri.account_name AND eba.ba_bank_name = eri.account_bank_name AND eba.ba_account_num = eri.account_no AND eba.deleted = 0) WHERE eri.deleted = 0;
# 刷新收款明细-应收明细-收入归属
UPDATE ecw_receivable_write_off_record erwor SET erwor.income_belong =
(SELECT eba.ba_income_belong FROM ecw_receipt_item eri LEFT JOIN ecw_bank_account eba ON eri.account_id = eba.id WHERE erwor.receipt_item_id = eri.id);
\ No newline at end of file
This diff is collapsed.
INSERT INTO `jiedao`.`system_dict_type`(`name`, `type`, `status`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES ('短信限流', 'system_sms_limit', 0, NULL, '1', '2024-10-31 10:08:50', '1', '2024-10-31 10:08:50', b'0');
INSERT INTO `jiedao`.`system_dict_data`(`sort`, `label`, `value`, `dict_type`, `status`, `color_type`, `css_class`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `label_en`,`label_fr`) VALUES (1, '限流时间', '10,1', 'system_sms_limit', 0, 'default', '', '例:10,1(每天请求十次)', '2740', '2024-11-05 14:22:53', '2740', '2024-11-05 14:24:33', b'0', 'Current limiting time','Temps de limitation actuelle');
package cn.iocoder.yudao.framework.security.core.util;
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
* RSA加密解密
*
* @author jayden
**/
public class RsaUtils
{
// Rsa 私钥
public static String privateKey = "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEA4TgukNwXxZ16sdy26bXMlCLLZMz4PlVYEQjGf2S/P0YvkDqSLxxaTTFpy83ZGizimYebnvfLtMmLzG/9gemVuwIDAQABAkA7X3E/NRZ7PTnEO9hookmtX8LY7wQegqc1zmdt3CRizGJRB7/9LzDqvnOIvqqm+EoiZLjUUNKVkOom0FI2u32hAiEA8UtmegwiMaqmE4xrjqocLRAR0aVWV7i4fSTcSvLVCcsCIQDu8fvGY9wfVKEGgyfcJHuORowDAbYYXOulxC6sEW7l0QIgE1J2Yk+WbWO86NPVyRbWKsWep6sVvvCL1XmeKmJHrQECIQDGAEmVbTyDzdodjmNiXezwye7NswZVC/LNi1LtjQircQIhAIpF1rvPvxXkE7KvWTePrCWeU/+c6e1ylG7sPYumc1cx";
/**
* 私钥解密
*
* @param text 待解密的文本
* @return 解密后的文本
*/
public static String decryptByPrivateKey(String text) throws Exception
{
return decryptByPrivateKey(privateKey, text);
}
/**
* 公钥解密
*
* @param publicKeyString 公钥
* @param text 待解密的信息
* @return 解密后的文本
*/
public static String decryptByPublicKey(String publicKeyString, String text) throws Exception
{
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] result = cipher.doFinal(Base64.decodeBase64(text));
return new String(result);
}
/**
* 私钥加密
*
* @param privateKeyString 私钥
* @param text 待加密的信息
* @return 加密后的文本
*/
public static String encryptByPrivateKey(String privateKeyString, String text) throws Exception
{
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] result = cipher.doFinal(text.getBytes());
return Base64.encodeBase64String(result);
}
/**
* 私钥解密
*
* @param privateKeyString 私钥
* @param text 待解密的文本
* @return 解密后的文本
*/
public static String decryptByPrivateKey(String privateKeyString, String text) throws Exception
{
PKCS8EncodedKeySpec pkcs8EncodedKeySpec5 = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec5);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] result = cipher.doFinal(Base64.decodeBase64(text));
return new String(result);
}
/**
* 公钥加密
*
* @param publicKeyString 公钥
* @param text 待加密的文本
* @return 加密后的文本
*/
public static String encryptByPublicKey(String publicKeyString, String text) throws Exception
{
X509EncodedKeySpec x509EncodedKeySpec2 = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec2);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] result = cipher.doFinal(text.getBytes());
return Base64.encodeBase64String(result);
}
/**
* 构建RSA密钥对
*
* @return 生成后的公私钥信息
*/
public static RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException
{
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded());
String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
return new RsaKeyPair(publicKeyString, privateKeyString);
}
/**
* RSA密钥对对象
*/
public static class RsaKeyPair
{
private final String publicKey;
private final String privateKey;
public RsaKeyPair(String publicKey, String privateKey)
{
this.publicKey = publicKey;
this.privateKey = privateKey;
}
public String getPublicKey()
{
return publicKey;
}
public String getPrivateKey()
{
return privateKey;
}
}
}
package cn.iocoder.yudao.framework.apollo.core.event.box;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* 排单校验 Event
*
* @author zhengYi
*/
@Data
@AllArgsConstructor
public class BoxCheckOrderUpdateSchedulingEvent {
/**
* 订单ID
*/
private Long orderId;
}
package cn.iocoder.yudao.framework.apollo.core.event.export;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ShipmentSummeryNewExcelExportPushEvent {
/**
* 操作用户
*/
private Long userId;
/**
* 端口
*/
private Integer userType;
/**
* 请求参数
*/
private String requestParams;
/**
* 国际化语言值,默认0中文, 具体取值I18nMessage.getLang()
*/
private Integer lang = 0;
/**
* 文件名称
*/
private String fileName;
/**
* 文件路径
*/
private String path;
/**
* 下载地址
*/
private String url;
/**
* 执行结果
*/
private String result;
@ApiModelProperty(value = "文件ID")
private Long fileId;
}
......@@ -190,6 +190,7 @@ public class CustomerApiImpl implements CustomerApi {
customerDTO.setName(customer.getName());
customerDTO.setNumber(customer.getNumber());
customerDTO.setPayerName(customer.getPayerName());
customerDTO.setDefaultBilling(customer.getDefaultBilling() ? 1 : 0);
return customerDTO;
}
}
......@@ -2,13 +2,22 @@ package cn.iocoder.yudao.module.ecw.api.bank;
import cn.iocoder.yudao.module.ecw.api.bank.dto.BankAccountDTO;
import java.util.List;
public interface BankApi {
/**
* 根据银行账号获取账号信息
*/
BankAccountDTO getBankAccountByAccountNo(String baAccountNum);
List<BankAccountDTO> getBankAccountByAccountNo(String baAccountNum);
/**
* 根据银行账号id获取账号信息
*/
BankAccountDTO getBankAccountByAccountId(Long id);
/**
* 更新银行账号余额
* @param bankAccountDTO
* @param isAdd
*/
void updateBankAccountBalance(BankAccountDTO bankAccountDTO, boolean isAdd);
}
package cn.iocoder.yudao.module.ecw.api.bank.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BankAccountDTO {
@ApiModelProperty(value = "银行账号编号", required = true)
private Long id;
......
......@@ -45,4 +45,10 @@ public interface CurrencyApi {
*/
ExchangeRateRespDTO getCurrencyRateByCode(String sourceCode, String targetCode);
/**
* 获取所有汇率
* @return
*/
List<ExchangeRateRespDTO> getAllCurrencyRate();
}
......@@ -11,4 +11,6 @@ public class CustomerDTO {
private String name;
private String payerName;
private Integer defaultBilling;
}
......@@ -14,6 +14,18 @@ public class RegionDTO {
@ApiModelProperty(value = "英文")
private String titleEn;
@ApiModelProperty(value = "进口国运费币种")
private String importCurrency1;
@ApiModelProperty(value = "进口国清关费币种")
private String importCurrency2;
@ApiModelProperty(value = "进口国额外费用主币种 (匹配币种一致的金额)")
private String importCurrency3;
@ApiModelProperty(value = "进口国额外费用副币种 (未匹配主币种的金额统一转换为额外费用副币种金额)")
private String importCurrency4;
@ApiModelProperty(value = "进口国应收额币种")
private String importCurrency5;
}
......@@ -34,4 +34,6 @@ public interface BankAccountConvert {
List<BankAccountExcelVO> convertList02(List<BankAccountDO> list);
BankAccountDTO convertDTO(BankAccountDO bankAccountDO);
List<BankAccountDTO> convertDTOList(List<BankAccountDO> bankAccountDOs);
}
package cn.iocoder.yudao.module.ecw.service.api;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.module.ecw.api.bank.BankApi;
import cn.iocoder.yudao.module.ecw.api.bank.dto.BankAccountDTO;
import cn.iocoder.yudao.module.ecw.convert.bankAccount.BankAccountConvert;
import cn.iocoder.yudao.module.ecw.dal.dataobject.bankAccount.BankAccountDO;
import cn.iocoder.yudao.module.ecw.dal.mysql.bankAccount.BankAccountMapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.List;
@Service
......@@ -16,12 +19,9 @@ public class BankApiImpl implements BankApi {
private BankAccountMapper bankAccountMapper;
@Override
public BankAccountDTO getBankAccountByAccountNo(String baAccountNum) {
List<BankAccountDO> bankAccountDO = bankAccountMapper.selectList("ba_account_num", baAccountNum);
if (bankAccountDO != null && !bankAccountDO.isEmpty()) {
return BankAccountConvert.INSTANCE.convertDTO(bankAccountDO.get(0));
}
return null;
public List<BankAccountDTO> getBankAccountByAccountNo(String baAccountNum) {
List<BankAccountDO> bankAccountDOs = bankAccountMapper.selectList("ba_account_num", baAccountNum);
return BankAccountConvert.INSTANCE.convertDTOList(bankAccountDOs);
}
@Override
......@@ -29,4 +29,29 @@ public class BankApiImpl implements BankApi {
BankAccountDO bankAccountDO = bankAccountMapper.selectById(id);
return BankAccountConvert.INSTANCE.convertDTO(bankAccountDO);
}
@Override
public void updateBankAccountBalance(BankAccountDTO bankAccountDTO, boolean isAdd) {
BankAccountDO bankAccountDO = null;
if (bankAccountDTO.getId() != null) {
bankAccountDO = bankAccountMapper.selectById(bankAccountDTO.getId());
} else {
List<BankAccountDO> bankAccountDOS = bankAccountMapper.selectList(Wrappers.lambdaQuery(BankAccountDO.class)
.eq(BankAccountDO::getBaAccountName, bankAccountDTO.getBaAccountName())
.eq(BankAccountDO::getBaAccountNum, bankAccountDTO.getBaAccountNum())
.eq(BankAccountDO::getBaBankName, bankAccountDTO.getBaBankName()));
if (CollectionUtil.isNotEmpty(bankAccountDOS)) {
bankAccountDO = bankAccountDOS.get(0);
}
}
if (bankAccountDO != null) {
BigDecimal baBalance = bankAccountDO.getBaBalance() == null ? BigDecimal.ZERO : bankAccountDO.getBaBalance();
if (isAdd) {
bankAccountDO.setBaBalance(baBalance.add(bankAccountDTO.getBaBalance()));
} else {
bankAccountDO.setBaBalance(baBalance.subtract(bankAccountDTO.getBaBalance()));
}
bankAccountMapper.updateById(bankAccountDO);
}
}
}
......@@ -195,4 +195,10 @@ public class CurrecyApiImpl implements CurrencyApi {
}
@Override
public List<ExchangeRateRespDTO> getAllCurrencyRate() {
List<ExchangeRateDO> exchangeRateDOS = exchangeRateService.selectList();
return ExchangeRateConvert.INSTANCE.convertList2(exchangeRateDOS);
}
}
......@@ -36,6 +36,10 @@ public class RegionApiImpl implements RegionApi {
regionDTO.setId(regionDO.getId());
regionDTO.setTitleZh(regionDO.getTitleZh());
regionDTO.setTitleEn(regionDO.getTitleEn());
regionDTO.setImportCurrency1(regionDO.getImportCurrency1());
regionDTO.setImportCurrency2(regionDO.getImportCurrency2());
regionDTO.setImportCurrency3(regionDO.getImportCurrency3());
regionDTO.setImportCurrency4(regionDO.getImportCurrency4());
regionDTO.setImportCurrency5(regionDO.getImportCurrency5());
return regionDTO;
}
......
......@@ -101,11 +101,6 @@ public class BankAccountServiceImpl implements BankAccountService {
vo.setBaCountryZh(baCountryDO.getTitleZh());
vo.setBaCountryEn(baCountryDO.getTitleEn());
}
if (vo.getBaIncomeBelong() != null) {
RegionDO baIncomeBelongDO = countryMap.get(vo.getBaIncomeBelong().longValue());
vo.setBaIncomeBelongZh(baIncomeBelongDO.getTitleZh());
vo.setBaIncomeBelongEn(baIncomeBelongDO.getTitleEn());
}
});
return voPageResult;
}
......
package cn.iocoder.yudao.module.member.controller.app.auth;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.validation.PhoneUtil;
import cn.iocoder.yudao.framework.common.util.ip.IPHelper;
import cn.iocoder.yudao.framework.dict.core.dto.DictDataRespDTO;
import cn.iocoder.yudao.framework.idempotent.core.annotation.Idempotent;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.framework.redis.helper.RedisHelper;
import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
import cn.iocoder.yudao.framework.security.core.util.RsaUtils;
import cn.iocoder.yudao.module.ecw.api.paramValid.ParamValidatorApi;
import cn.iocoder.yudao.module.ecw.service.paramValid.ParamValidatorService;
import cn.iocoder.yudao.module.member.controller.app.auth.vo.*;
import cn.iocoder.yudao.module.member.service.auth.MemberAuthService;
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
import cn.iocoder.yudao.module.system.enums.sms.SmsNodeEnum;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
......@@ -38,6 +44,10 @@ public class AppAuthController {
private MemberAuthService authService;
@Resource
private ParamValidatorApi paramValidatorApi;
@Resource
private RedisHelper redisHelper;
@Resource
private DictDataApi dictDataApi;
@PostMapping("/reg")
@ApiOperation("使用手机注册")
......@@ -99,10 +109,86 @@ public class AppAuthController {
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
@Idempotent(timeout = 5)
public CommonResult<Boolean> sendSmsCode(@RequestBody @Valid AppAuthSendSmsReqVO reqVO) {
// 短信限流
processSmsRequest(reqVO);
authService.sendSmsCode(getLoginUserId(), reqVO);
return success(true);
}
/**
* 短信限流
* @param reqVO
*/
public void processSmsRequest(AppAuthSendSmsReqVO reqVO) {
String nodeValue = reqVO.getNodeValue();
if (SmsNodeEnum.MEMBER_REG.getNodeValue().equals(nodeValue)) {
char[] specialChars = {'!', '@', '#', '$', '%', '^', '&', '*'};
// 生成随机索引
int randomIndex = (int) (reqVO.getP2()[1] % specialChars.length);
// 选择特殊字符
char specialChar = specialChars[randomIndex];
/*
* 1:手机号+节点+秘钥
* 2:手机号+国家号+秘钥
* 3:手机号+国家号+节点+秘钥
*/
String key = "gzjd8888";
String str = "";
if (reqVO.getP2()[0] == 1) {
str = reqVO.getMobile() + reqVO.getNodeValue() + key + specialChar;
} else if (reqVO.getP2()[0] == 2) {
str = reqVO.getMobile() + reqVO.getAreaCode() + key + specialChar;
} else {
str = reqVO.getMobile() + reqVO.getAreaCode() + reqVO.getNodeValue() + key + specialChar;
}
if (str.isEmpty()) {
throw new ServiceException(500, "Unlawful request");
} else {
try {
if (!str.equals(RsaUtils.decryptByPrivateKey(reqVO.getP1()))) {
throw new ServiceException(500, "Unlawful request");
}
} catch (Exception e) {
throw new ServiceException(500, "Unlawful request");
}
}
// 获取客户端IP地址
String clientIp = IPHelper.getIpAddr();
// 定义IP风控的阈值和时间窗口
List<DictDataRespDTO> listPack =
dictDataApi.getDictDatas("system_sms_limit");
int maxAttempts = 1;
int timeWindowSeconds = 1;
if (!listPack.isEmpty()) {
String[] split = listPack.get(0).getValue().split(",");
maxAttempts = Integer.parseInt(split[0]);
timeWindowSeconds = Integer.parseInt(split[1]);
}
// 构建Redis键
String redisKey = "ip:sms:limit:" + clientIp;
// 检查当前IP地址的请求次数
String attempts = redisHelper.get(redisKey);
if (attempts == null) {
// 如果是第一次请求,设置过期时间
redisHelper.set(redisKey, String.valueOf(1), timeWindowSeconds, TimeUnit.DAYS);
} else {
int attemptsInt = Integer.parseInt(attempts) + 1;
if (attemptsInt > maxAttempts) {
// 如果超过阈值,返回错误信息
throw new ServiceException(500, "Unlawful request");
} else {
redisHelper.set(redisKey, String.valueOf(attemptsInt), timeWindowSeconds, TimeUnit.DAYS);
}
}
}
}
@PostMapping("/send-email-code")
@ApiOperation(value = "发送邮箱验证码")
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
......@@ -153,12 +239,8 @@ public class AppAuthController {
@GetMapping("/social-auth-redirect")
@ApiOperation("社交授权的跳转")
@ApiImplicitParams({
@ApiImplicitParam(name = "type", value = "社交类型", required = true, dataTypeClass = Integer.class),
@ApiImplicitParam(name = "redirectUri", value = "回调路径", dataTypeClass = String.class)
})
public CommonResult<String> socialAuthRedirect(@RequestParam("type") Integer type,
@RequestParam("redirectUri") String redirectUri) {
@ApiImplicitParams({@ApiImplicitParam(name = "type", value = "社交类型", required = true, dataTypeClass = Integer.class), @ApiImplicitParam(name = "redirectUri", value = "回调路径", dataTypeClass = String.class)})
public CommonResult<String> socialAuthRedirect(@RequestParam("type") Integer type, @RequestParam("redirectUri") String redirectUri) {
return CommonResult.success(authService.getSocialAuthorizeUrl(type, redirectUri));
}
......
......@@ -48,4 +48,14 @@ public class AppAuthSendSmsReqVO {
// 登录遗留处理:scene = 1
private Integer scene;
/**
* 加密参数
*/
private String p1;
/**
* 加密规则
*/
private Long[] p2;
}
......@@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQuery;
import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO;
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.OrderCostSummaryDto;
import cn.iocoder.yudao.module.order.dto.OrderExportBackDTO;
import cn.iocoder.yudao.module.order.dto.OrderBackInfoDto;
import cn.iocoder.yudao.module.order.dto.SearchBackDto;
......@@ -3480,4 +3481,6 @@ public interface OrderMapper extends AbstractMapper<OrderDO> {
void updateOrderCustomerAndSalesmanId(@Param("customerId")Long customerId,@Param("salesmanId") Long salesmanId,@Param("orderId") Long orderId);
StatisticsOrderVO statisticsPickUp(@Param("query") OrderQueryVO query);
List<OrderBackPageVO> containerOrderSummaryList(@Param("query") ContainerReportOrderQueryVO query);
}
......@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Objects;
@Data
@ApiModel("费用分组dto")
......@@ -16,4 +17,21 @@ public class FeeGroupDto {
private Long currencyId;
@ApiModelProperty("货币名称(只展示英文代码)")
private String currencyName;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
FeeGroupDto that = (FeeGroupDto) o;
return Objects.equals(currencyId, that.currencyId);
}
@Override
public int hashCode() {
return Objects.hashCode(currencyId);
}
public void addAmount(BigDecimal amount) {
this.amount = this.amount.add(amount);
}
}
......@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.excel.convert.DictConvert;
import cn.iocoder.yudao.module.depository.dto.LogisticsInfoDto;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -29,6 +30,7 @@ import static cn.iocoder.yudao.module.bpm.enums.DictTypeConstants.TRANSPORT_TYPE
*/
@Data
@ApiModel("订单费用汇总")
// TODO 表格index待调整
public class OrderCostSummaryDto {
@ExcelProperty(value = "序号", index = 0)
......@@ -73,7 +75,7 @@ public class OrderCostSummaryDto {
@ExcelIgnore
@ApiModelProperty(value = "是否控货")
private Boolean isCargoControl;
private Integer isCargoControl;
// @ExcelIgnore
@ExcelProperty(value = "订单入仓时间", index = 29)
......@@ -151,6 +153,14 @@ public class OrderCostSummaryDto {
@ApiModelProperty(value = "已收运费(货币分组列表转换字符串)")
private String writeOffFreightFeeGroup;
@ExcelIgnore
@ApiModelProperty(value = "未收运费货币分组列表")
private List<FeeGroupDto> notWriteOffFreightFeeGroupDtoList;
@ExcelProperty(value = "未收运费", index = 17)
@ApiModelProperty(value = "未收运费(货币分组列表转换字符串)")
private String notWriteOffFreightFeeGroup;
@ExcelIgnore
@ApiModelProperty(value = "实收清关费")
private BigDecimal netReceiptsClearanceFee;
......@@ -196,9 +206,17 @@ public class OrderCostSummaryDto {
private List<FeeGroupDto> writeOffClearanceFeeGroupDtoList;
@ExcelProperty(value = "已收清关费", index = 21)
@ApiModelProperty(value = "已收额外费用(货币分组列表转换字符串)")
@ApiModelProperty(value = "已收清关费用(货币分组列表转换字符串)")
private String writeOffClearanceFeeGroup;
@ExcelIgnore
@ApiModelProperty(value = "未收清关费货币分组列表")
private List<FeeGroupDto> notWriteOffClearanceFeeGroupDtoList;
@ExcelProperty(value = "未收清关费", index = 21)
@ApiModelProperty(value = "未收清关费用(货币分组列表转换字符串)")
private String notWriteOffClearanceFeeGroup;
@ExcelIgnore
@ApiModelProperty(value = "实收额外费用")
private BigDecimal netReceiptsOtherFee;
......@@ -247,6 +265,14 @@ public class OrderCostSummaryDto {
@ApiModelProperty(value = "已收额外费用(货币分组列表转换字符串)")
private String writeOffOtherFeeGroup;
@ExcelIgnore
@ApiModelProperty(value = "未收额外费用货币分组列表")
private List<FeeGroupDto> notWriteOffOtherFeeGroupDtoList;
@ExcelProperty(value = "未收额外费用", index = 99)
@ApiModelProperty(value = "未收额外费用(货币分组列表转换字符串)")
private String notWriteOffOtherFeeGroup;
@ExcelIgnore
@ApiModelProperty(value = "核销币种(总额计算统一币种,当币种有多个时,以美元计算,否则以当前单一币种计算)")
private Long writeOffCurrencyId;
......@@ -306,6 +332,14 @@ public class OrderCostSummaryDto {
@ApiModelProperty(value = "已收总金额(货币分组列表转换字符串)")
private String writeOffTotalFeeGroup;
@ExcelIgnore
@ApiModelProperty(value = "未收总金额货币分组列表")
private List<FeeGroupDto> notWriteOffTotalFeeGroupDtoList;
@ExcelProperty(value = "未收总金额", index = 99)
@ApiModelProperty(value = "未收总金额(货币分组列表转换字符串)")
private String notWriteOffTotalFeeGroup;
@ExcelProperty(value = "是否全部核销", index = 26)
@ApiModelProperty(value = "是否全部核销")
......@@ -514,6 +548,64 @@ public class OrderCostSummaryDto {
@ApiModelProperty(value = "订单状态")
private String statusMsg;
@ApiModelProperty(value = "财务2.2-提货率")
private BigDecimal pickRatio;
@ApiModelProperty(value = "财务2.2-提单制作状态 2已完成")
private Integer billOfLadingStatus;
@ExcelProperty("收货人客户id")
@ApiModelProperty(value = "财务2.2-收货人客户id")
private Long consigneeCustomerId;
@ExcelProperty("收货人客户编号")
@ApiModelProperty(value = "财务2.2-收货人客户编号")
private String consigneeCustomerNumber;
@ExcelProperty("收货人姓名")
@ApiModelProperty(value = "财务2.2-收货人姓名")
private String consigneeName;
@ExcelProperty("收货人姓名(英文)")
@ApiModelProperty(value = "财务2.2-收货人姓名(英文)")
private String consigneeNameEn;
@ExcelProperty("收货人手机")
@ApiModelProperty(value = "财务2.2-收货人手机")
private String consigneePhone;
@ExcelProperty("发货人姓名")
@ApiModelProperty(value = "财务2.2-发货人姓名")
private String consignorName;
@ExcelProperty("发货人客户id")
@ApiModelProperty(value = "财务2.2-发货人客户id")
private Long consignorCustomerId;
@ExcelProperty("发货人客户编号")
@ApiModelProperty(value = "财务2.2-发货人客户编号")
private String consignorCustomerNumber;
@ExcelProperty("发货人姓名(英文)")
@ApiModelProperty(value = "财务2.2-发货人姓名(英文)")
private String consignorNameEn;
@ExcelProperty("发货人手机")
@ApiModelProperty(value = "财务2.2-发货人手机")
private String consignorPhone;
@ApiModelProperty(value = "财务2.2-到港时间")
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date daogangTime;
@ApiModelProperty(value = "财务2.2-清关时间")
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date qingguanTime;
@ApiModelProperty(value = "财务2.2-已卸柜/出仓时间")
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date unloadTime;
public void setWriteOffProportion(BigDecimal writeOffProportion) {
this.writeOffProportion = writeOffProportion;
......@@ -529,4 +621,17 @@ public class OrderCostSummaryDto {
this.orderTypeName = orderType == 1 ? "否" : "是";
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
OrderCostSummaryDto that = (OrderCostSummaryDto) o;
return Objects.equals(orderId, that.orderId);
}
@Override
public int hashCode() {
return Objects.hashCode(orderId);
}
}
......@@ -41,6 +41,7 @@ public enum CustomDraweeEnum {
warehouseRent("warehouseRent","仓租费","Warehouse rental fee",15),
magneticInspectionFee("magneticInspectionFee","磁检费","Magnetic inspection fee",16),
additionalFee("additionalFee","附加费","Additional Fee",17),
consolidatedServiceFee("consolidatedServiceFee","集运服务费","Consolidated service fee",18),
// TODO 待补充...
......
......@@ -321,6 +321,8 @@ public interface ErrorCodeConstants {
ErrorCode ORDER_IS_WAITING_SHIPMENT = new ErrorCode(1006010079, "order.is.waiting.shipment");
ErrorCode WAREHOUSE_IN_RECORD_DATA_NOT_IS_ZERO = new ErrorCode(1006010080, "warehouse.in.record.data.not.is.zero");
ErrorCode WAREHOUSE_ADJUST_HAVE_ARRIVED = new ErrorCode(1006010081, "warehouse.adjust.have.arrived");
ErrorCode USER_NOT_EXISTS = new ErrorCode(1004001000, "member.user.not.exist");
ErrorCode ORDER_NEED_PERSONAL_KYC = new ErrorCode(1004001112, "order.need.personal.kyc");
......@@ -431,7 +433,7 @@ 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 ORDER_UPDATE_BOX_EXCEPTION = new ErrorCode(1004001174, "warehouse.in.box.exception");
......
......@@ -416,4 +416,6 @@ public interface OrderQueryService {
* @return true 是拆单子订单 false 否
*/
boolean isSplitOrderChildren(OrderDO orderDO);
ContainerReportOrderPageResult<OrderCostSummaryDto> containerOrderSummary(ContainerReportOrderQueryVO query, PageVO page);
}
......@@ -10,6 +10,7 @@ import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderApprovalTypeCheck
import cn.iocoder.yudao.framework.apollo.core.event.Order.OrderAssociationOfferInfoEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrderApprovalEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrderRemoveLadingBillEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxCheckOrderUpdateSchedulingEvent;
import cn.iocoder.yudao.framework.apollo.core.event.box.BoxOrderDynamicEstTimeEvent;
import cn.iocoder.yudao.framework.apollo.core.event.warehouseIn.WarehouseInOrderChangeChannelEvent;
import cn.iocoder.yudao.framework.apollo.core.event.warehouseIn.WarehouseInOrderChangeTransportEvent;
......@@ -1834,6 +1835,9 @@ public class OrderServiceImpl extends AbstractService<OrderMapper, OrderDO> impl
if (vo.getShipmentState() > 0 && !(vo.getShipmentState() == 304 || vo.getShipmentState() == 305) ) {
throw exception(ORDER_SHIPMENT_NOT_UPDATE);
}
// 正在预装中的订单不允许修改
BoxCheckOrderUpdateSchedulingEvent schedulingEvent = new BoxCheckOrderUpdateSchedulingEvent(vo.getOrderId());
applicationContext.publishEvent(schedulingEvent);
// 获取功能开关
List<DictDataRespDTO> dictList = dictDataApi.getDictDatas("part_function_switch");
// 智慧预装功能开关
......
......@@ -475,6 +475,10 @@ public class OrderWarehouseAdjustServiceImpl extends AbstractService<OrderWareho
if (orderWarehouseAdjustDO == null) {
throw exception(WAREHOUSE_ADJUST_NOT_EXISTS);
}
// 不是出仓状态不可操作到仓
if (!Objects.equals(OrderWarehouseAdjustStatusEnum.deliveries.getValue() , orderWarehouseAdjustDO.getStatus())){
throw exception(WAREHOUSE_ADJUST_HAVE_ARRIVED);
}
String note = "";
// 转异
......
package cn.iocoder.yudao.module.order.vo.order;
import cn.iocoder.yudao.module.order.dto.FeeGroupDto;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Data
@ApiModel("分页结果")
public final class ContainerReportOrderPageResult<T> implements Serializable {
@ApiModelProperty(value = "数据", required = true)
private List<T> list;
@ApiModelProperty(value = "总量", required = true, example = "0")
private Long total = 0L;
@ApiModelProperty(value = "每页记录数", required = true, example = "10")
private Long rows = 10L;
@ApiModelProperty(value = "当前页数", required = true, example = "1")
private Long page = 1L;
@ApiModelProperty(value = "总页数", required = true, example = "0")
private Long pages = 0L;
@ApiModelProperty(value = "应收总金额货币分组列表")
private List<FeeGroupDto> receivableTotalFeeGroupDtoList = new ArrayList<>();
@ApiModelProperty(value = "优惠总金额货币分组列表")
private List<FeeGroupDto> discountTotalFeeGroupDtoList = new ArrayList<>();
@ApiModelProperty(value = "实收总金额货币分组列表")
private List<FeeGroupDto> netReceiptsTotalFeeGroupDtoList = new ArrayList<>();
@ApiModelProperty(value = "已收总金额货币分组列表")
private List<FeeGroupDto> writeOffTotalFeeGroupDtoList = new ArrayList<>();
@ApiModelProperty(value = "未收总金额货币分组列表")
private List<FeeGroupDto> notWriteOffTotalFeeGroupDtoList = new ArrayList<>();
@ApiModelProperty(value = "当页应收总金额货币分组列表")
private List<FeeGroupDto> pageReceivableTotalFeeGroupDtoList = new ArrayList<>();
@ApiModelProperty(value = "当页优惠总金额货币分组列表")
private List<FeeGroupDto> pageDiscountTotalFeeGroupDtoList = new ArrayList<>();
@ApiModelProperty(value = "当页实收总金额货币分组列表")
private List<FeeGroupDto> pageNetReceiptsTotalFeeGroupDtoList = new ArrayList<>();
@ApiModelProperty(value = "当页已收总金额货币分组列表")
private List<FeeGroupDto> pageWriteOffTotalFeeGroupDtoList = new ArrayList<>();
@ApiModelProperty(value = "当页未收总金额货币分组列表")
private List<FeeGroupDto> pageNotWriteOffTotalFeeGroupDtoList = new ArrayList<>();
public ContainerReportOrderPageResult() {
}
public ContainerReportOrderPageResult(List<T> list, long total) {
this.list = list;
this.total = total;
}
public ContainerReportOrderPageResult(List<T> list, long total, long rows, long page, long pages) {
this.list = list;
this.rows = rows;
this.page = page;
this.pages = pages;
this.total = total;
}
public ContainerReportOrderPageResult(long total) {
this.list = new ArrayList<>();
this.total = total;
}
public static <T> ContainerReportOrderPageResult<T> empty() {
return new ContainerReportOrderPageResult<>();
}
public static <T> ContainerReportOrderPageResult<T> empty(long total) {
return new ContainerReportOrderPageResult<>(total);
}
/****
* 分页转换
* @param pager
* @return
*/
public static <T> ContainerReportOrderPageResult<T> of(IPage<T> pager) {
return new ContainerReportOrderPageResult<>(pager.getRecords(), pager.getTotal(), pager.getSize(), pager.getCurrent(), pager.getPages());
}
/****
* 分页转换
* @param pager
* @return
*/
public static <T> ContainerReportOrderPageResult<T> of(PageInfo<T> pager) {
return new ContainerReportOrderPageResult<>(pager.getList(), pager.getTotal(), pager.getPageSize(), pager.getPageNum(), pager.getPages());
}
}
package cn.iocoder.yudao.module.order.vo.order;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
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;
@Data
@ApiModel("管理后台 - 自编号报表订单查询 VO")
public class ContainerReportOrderQueryVO {
@ApiModelProperty(value = "自编号")
@NotBlank(message = "自编号不能为空")
private String containerNumber;
@ApiModelProperty(value = "订单编号")
private String orderNo;
@ApiModelProperty(value = "提单编号")
private String tidanNo;
@ApiModelProperty(value = "唛头")
private String marks;
@ApiModelProperty(value = "发货人客户编号,姓名、手机号搜索")
private String consignorKey;
@ApiModelProperty(value = "收货人客户编号,姓名、手机号搜索")
private String consigneeKey;
@ApiModelProperty(value = "始发仓IDs")
private List<Long> startWarehouseIds;
@ApiModelProperty(value = "目的仓IDs")
private List<Long> destWarehouseIds;
@ApiModelProperty(value = "目的国ids")
private List<Long> destCountryIds;
@ApiModelProperty(value = "目的地ids")
private List<Long> destCityIds;
@ApiModelProperty(value = "订单状态详情见字典:order_status")
private Integer status;
@ApiModelProperty(value = "是否重货")
private Integer isHeavyCargo;
@ApiModelProperty(value = "是否泡货")
private Integer isPaoCargo;
@ApiModelProperty(value = "订单类型")
private List<Integer> orderType;
@ApiModelProperty(value = "是否控货")
private Integer isCargoControl;
@ApiModelProperty(value = "不等于提货率")
private BigDecimal nePickRatio;
@ApiModelProperty(value = "小于等于提货率")
private BigDecimal lePickRatio;
@ApiModelProperty(value = "等于提货率")
private BigDecimal eqPickRatio;
@ApiModelProperty(value = "大于等于提货率")
private BigDecimal gePickRatio;
@ApiModelProperty(value = "开始放货锁定收货人到期时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date beginLockConsigneeTime;
@ApiModelProperty(value = "结束放货锁定收货人到期时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date endLockConsigneeTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始送货时间")
private Date beginDeliveryDate;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束送货时间")
private Date endDeliveryDate;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始入仓时间")
private Date beginRucangTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束入仓时间")
private Date endRucangTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始入仓记录时间")
private Date beginWarehouseInTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束入仓记录时间")
private Date endWarehouseInTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始到港时间")
private Date beginDaogangTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束到港时间")
private Date endDaogangTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始清关时间")
private Date beginQingguanTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束清关时间")
private Date endQingguanTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始已预装时间")
private Date beginPreLoadTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束已预装时间")
private Date endPreLoadTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始已装柜时间")
private Date beginLoadTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始出仓时间")
private Date beginOutboundTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束出仓时间")
private Date endOutboundTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始理货时间")
private Date beginTallyTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束理货时间")
private Date endTallyTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始出货时间")
private Date beginShippingTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束出货时间")
private Date endShippingTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束已装柜时间")
private Date endLoadTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始已卸柜时间")
private Date beginUnloadTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束已卸柜时间")
private Date endUnloadTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始提货时间")
private Date beginTakeTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束提货时间")
private Date endTakeTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始提货记录时间")
private Date beginPickUpTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束提货记录时间")
private Date endPickUpTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始拆单时间")
private Date beginSplitTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束拆单时间")
private Date endSplitTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始创建时间")
private Date beginCreateTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束创建时间")
private Date endCreateTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始放货时间")
private Date beginReleaseTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束放货时间")
private Date endReleaseTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始复核时间")
private Date beginCheckTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束复核时间")
private Date endCheckTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始放货时间")
private Date beginPickTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束放货时间")
private Date endPickTime;
@ApiModelProperty(value = "语言")
private Integer lang;
}
package cn.iocoder.yudao.module.order.vo.order;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.common.util.spring.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.i18n.core.I18nMessage;
import cn.iocoder.yudao.module.order.dto.OrderRemindExceptionDto;
import cn.iocoder.yudao.module.order.enums.OrderAbnormalStateEnum;
......@@ -557,6 +558,15 @@ public class OrderBackPageVO {
@ApiModelProperty(value = "到仓重量")
private BigDecimal checkWeight;
@ApiModelProperty(value = "财务2.2-提单制作状态 2已完成")
private Integer billOfLadingStatus;
@ApiModelProperty(value = "财务2.2-到港时间")
private Date daogangTime;
@ApiModelProperty(value = "财务2.2-清关时间")
private Date qingguanTime;
public void setGuanLianOrderStatus(String guanLianOrderStatus) {
this.guanLianOrderStatus = guanLianOrderStatus;
......
......@@ -7594,5 +7594,177 @@
</if>
<include refid="orderQuery"/>
</select>
<select id="containerOrderSummaryList" resultType="cn.iocoder.yudao.module.order.vo.order.OrderBackPageVO">
SELECT
o.*,
w.start_warehouse_name,
w.dst_warehouse_name,
w.start_warehouse_id,
w.dst_warehouse_id,
bl.status as billOfLadingStatus,
norc.id as consignorCustomerId,
norc.number as consignorCustomerNumber,
norc.name as consignorName,
norc.name_en as consignorNameEn,
nor.phone as consignorPhone,
neeo.id as consigneeCustomerId,
neeo.name as consigneeName,
neeo.name_en as consigneeNameEn,
nee.phone as consigneePhone,
neeo.number as consigneeCustomerNumber,
(select su.nickname from system_user su where su.deleted = 0 and su.id = o.salesman_id) as salesman_name,
(select min(wi.`in_time`) from ecw_order_warehouse_in wi where wi.deleted = 0 and wi.order_id = o.order_id ) as in_time
FROM ecw_order o
LEFT JOIN (
SELECT
ewl.id AS line_id,
ew_start.id AS start_warehouse_id,
ew_dest.id AS dst_warehouse_id,
ew_start.title_zh AS start_title_zh,
IF( #{query.lang} = 0, ew_dest.title_zh, ew_dest.title_en ) AS dst_warehouse_name,
IF( #{query.lang} = 0, ew_start.title_zh, ew_start.title_en ) AS start_warehouse_name
FROM
ecw_warehouse_line ewl
LEFT JOIN ecw_warehouse ew_start ON ewl.start_warehouse_id = ew_start.id
LEFT JOIN ecw_warehouse ew_dest ON ewl.dest_warehouse_id = ew_dest.id
) w ON w.line_id = o.line_id
LEFT JOIN ecw_order_consignor nor on nor.order_id = o.order_id and nor.deleted = 0
LEFT JOIN ecw_order_consignee nee on nee.order_id = o.order_id and nee.deleted = 0
LEFT JOIN ecw_make_bill_of_lading bl on bl.order_id = o.order_id and bl.deleted = 0
LEFT JOIN ecw_customer norc on norc.id = nor.customer_id
LEFT JOIN ecw_customer neeo on neeo.id = nee.customer_id
WHERE o.`container_number` = #{query.containerNumber}
<include refid="containerOrderSummaryQuery"/>
</select>
<sql id="containerOrderSummaryQuery">
<if test="query.orderNo != null and query.orderNo != '' ">
AND o.`order_no` like concat("%",concat(#{query.orderNo},"%"))
</if>
<if test="query.tidanNo != null and query.tidanNo != '' ">
AND o.`tidan_no` like concat("%",concat(#{query.tidanNo},"%"))
</if>
<if test="query.marks != null and query.marks != '' ">
AND o.`marks` like concat("%",concat(#{query.marks},"%"))
</if>
<if test="query.consignorKey != null and query.consignorKey != '' ">
AND (concat(IFNULL(nor.`name`,''),IFNULL(nor.`name_en`,''),IFNULL(nor.`phone`,'')) like
concat("%",concat(#{query.consignorKey},"%"))
OR nor.customer_id in (select c.id from ecw_customer c where c.number like
concat("%",concat(#{query.consignorKey},"%"))))
</if>
<if test="query.consigneeKey != null and query.consigneeKey != '' ">
AND (concat(IFNULL(nee.`name`,''),IFNULL(nee.`name_en`,''),IFNULL(nee.`phone`,'')) like
concat("%",concat(#{query.consigneeKey},"%"))
OR nee.customer_id in (select c.id from ecw_customer c where c.number like
concat("%",concat(#{query.consigneeKey},"%"))))
</if>
<if test="query.startWarehouseIds !=null and query.startWarehouseIds.size() > 0 and query.destWarehouseIds !=null and query.destWarehouseIds.size() > 0 ">
and (o.line_id in(
select whl.id
from ecw_warehouse_line whl
where whl.start_warehouse_id in
<foreach item='warehouseId' collection='query.startWarehouseIds' open='(' separator=',' close=')'>
#{warehouseId}
</foreach>
and whl.dest_warehouse_id in
<foreach item='destWarehouseId' collection='query.destWarehouseIds' open='(' separator=',' close=')'>
#{destWarehouseId}
</foreach>
))
</if>
<if test="query.startWarehouseIds !=null and query.startWarehouseIds.size() > 0 and (query.destWarehouseIds==null or query.destWarehouseIds.size() == 0) ">
and (o.line_id in(
select whl.id
from ecw_warehouse_line whl
where whl.start_warehouse_id in
<foreach item='warehouseId' collection='query.startWarehouseIds' open='(' separator=',' close=')'>
#{warehouseId}
</foreach>
))
</if>
<if test="(query.startWarehouseIds ==null or query.startWarehouseIds.size() == 0) and query.destWarehouseIds !=null and query.destWarehouseIds.size() > 0 ">
and (o.line_id in(
select whl.id
from ecw_warehouse_line whl
where whl.dest_warehouse_id in
<foreach item='destWarehouseId' collection='query.destWarehouseIds' open='(' separator=',' close=')'>
#{destWarehouseId}
</foreach>
))
</if>
<if test="query.destCountryIds != null and query.destCountryIds.size()>0 ">
AND ob.`objective_country_id` in
<foreach item='destCountryId' index='index' collection='query.destCountryIds' open='(' separator=',' close=')'>
#{destCountryId}
</foreach>
</if>
<if test="query.status != null">
AND o.`status` = #{query.status}
</if>
<if test="query.lePickRatio != null ">
AND o.pick_ratio <![CDATA[ <= ]]> #{query.lePickRatio}
</if>
<if test="query.gePickRatio != null ">
AND o.pick_ratio <![CDATA[ >= ]]> #{query.gePickRatio}
</if>
<if test="query.eqPickRatio != null ">
AND o.pick_ratio = #{query.eqPickRatio}
</if>
<if test="query.eqPickRatio != null ">
AND o.pick_ratio <![CDATA[ != ]]> #{query.eqPickRatio}
</if>
<if test="query.isCargoControl != null ">
AND o.is_cargo_control = #{query.isCargoControl}
</if>
<if test="query.orderType != null and query.orderType.size()>0 ">
AND o.`order_type` in
<foreach item='item' index='index' collection='query.orderType' open='(' separator=',' close=')'>
#{item}
</foreach>
</if>
<if test="query.beginRucangTime != null and query.endRucangTime != null ">
AND o.order_id in(select distinct wi.order_id from ecw_order_warehouse_in wi where wi.deleted = 0 and
wi.`in_time` between #{query.beginRucangTime} and #{query.endRucangTime})
</if>
<if test="query.beginQingguanTime != null and query.endQingguanTime != null ">
AND o.`qingguan_time` between #{query.beginQingguanTime} and #{query.endQingguanTime}
</if>
<if test="query.beginDaogangTime != null and query.endDaogangTime != null ">
AND o.`daogang_time` between #{query.beginDaogangTime} and #{query.endDaogangTime}
</if>
<if test="query.beginPreLoadTime != null and query.endPreLoadTime != null ">
AND o.`status` > 5 AND o.`pre_load_time` between #{query.beginPreLoadTime} and #{query.endPreLoadTime}
</if>
<if test="query.beginOutboundTime != null and query.endOutboundTime != null ">
AND o.`status` > 5 AND o.container_number in(select distinct b.self_no from ecw_box_air_checkout bc join ecw_box b ON bc.shipment_id = b.id
where b.deleted = 0 and bc.deleted = 0 and bc.`checkout_time` between #{query.beginOutboundTime} and #{query.endOutboundTime})
</if>
<if test="query.beginLoadTime != null and query.endLoadTime != null ">
AND o.`status` > 5 AND o.`load_time` between #{query.beginLoadTime} and #{query.endLoadTime}
</if>
<if test="query.beginUnloadTime != null and query.endUnloadTime != null ">
AND o.`status` > 5 AND o.`unload_time` between #{query.beginUnloadTime} and #{query.endUnloadTime}
</if>
<if test="query.beginTakeTime != null and query.endTakeTime != null ">
AND o.`status` > 19 AND o.`take_time` between #{query.beginTakeTime} and #{query.endTakeTime}
</if>
<if test="query.beginSplitTime != null and query.endSplitTime != null ">
AND o.`split_time` between #{query.beginSplitTime} and #{query.endSplitTime}
</if>
<if test="query.beginCreateTime != null and query.endCreateTime != null ">
AND o.`create_time` between #{query.beginCreateTime} and #{query.endCreateTime}
</if>
<if test="query.beginPickTime != null and query.endPickTime != null ">
AND o.order_id in(select distinct op.order_id from ecw_order_cargo_control_pick op where op.deleted = 0 and
op.status in(1,3) and op.`create_time` between #{query.beginPickTime} and #{query.endPickTime})
</if>
<if test="query.beginPickUpTime != null and query.endPickUpTime != null ">
AND o.order_no in(select distinct op.order_id from ecw_order_pickup op where op.deleted = 0 and
op.`create_time` between #{query.beginPickUpTime} and #{query.endPickUpTime})
</if>
<if test="query.beginWarehouseInTime != null and query.endWarehouseInTime != null ">
AND o.order_id in(select distinct wi.order_id from ecw_order_warehouse_in wi where wi.deleted = 0 and
wi.`update_time` between #{query.beginWarehouseInTime} and #{query.endWarehouseInTime})
</if>
</sql>
</mapper>
......@@ -8,6 +8,8 @@ import cn.iocoder.yudao.module.order.dto.OrderCostSummaryDto;
import cn.iocoder.yudao.module.order.dto.OrderDetailSummaryDto;
import cn.iocoder.yudao.module.order.service.order.OrderQueryService;
import cn.iocoder.yudao.module.order.service.orderException.OrderExceptionService;
import cn.iocoder.yudao.module.order.vo.order.ContainerReportOrderPageResult;
import cn.iocoder.yudao.module.order.vo.order.ContainerReportOrderQueryVO;
import cn.iocoder.yudao.module.order.vo.order.OrderBackPageVO;
import cn.iocoder.yudao.module.order.vo.order.OrderQueryVO;
import io.swagger.annotations.Api;
......@@ -17,10 +19,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.HashMap;
......@@ -81,4 +80,14 @@ public class OrderCountController {
return success(orderQueryService.orderDetailSummaryByOrderId(orderId));
}
@PostMapping("/containerNumber/orderSummary/new")
@ApiOperation("财务2.2-自编号的订单费用汇总")
public CommonResult<ContainerReportOrderPageResult<OrderCostSummaryDto>> orderSummaryNew(@RequestBody ContainerReportOrderQueryVO query, PageVO page) {
if (StringUtils.isBlank(query.getContainerNumber())) {
return error(CONTAINER_NUMBER_NOT_NULL);
}
ContainerReportOrderPageResult<OrderCostSummaryDto> summaryDtoPage = orderQueryService.containerOrderSummary(query, page);
return success(summaryDtoPage);
}
}
......@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.shipment.listener;
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.BoxCheckOrderUpdateSchedulingEvent;
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;
......@@ -22,6 +23,7 @@ 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.ORDER_UPDATE_BOX_EXCEPTION;
import static cn.iocoder.yudao.module.order.enums.ErrorCodeConstants.WAREHOUSE_IN_BOX_EXCEPTION;
/**
......@@ -56,6 +58,22 @@ public class BoxCheckOrderSchedulingListener {
}
/**
* 提供订单是否已经排单校验的接口,如果已经排单,则不能货物补充(会导致已装体积重量的不正确),需要先从预装单中移除才能继续补充,
*
* @param event 订单号
*/
@EventListener(BoxCheckOrderUpdateSchedulingEvent.class)
public void checkOrderUpdateScheduling(BoxCheckOrderUpdateSchedulingEvent event) {
Long orderId = event.getOrderId();
log.info("提供订单是否已经排单校验的接口 orderId={}", orderId);
BoxDO boxDO = boxService.checkOrderScheduling(orderId);
if (boxDO != null) {
throw exception(ORDER_UPDATE_BOX_EXCEPTION);
}
}
/**
* 提供多订单订单是否已经排单校验的接口
* 返回已排单的订单id
......
......@@ -22,6 +22,7 @@ import cn.iocoder.yudao.module.system.api.file.FileMakeApi;
import cn.iocoder.yudao.module.system.api.file.dto.FileMakeReqDTO;
import cn.iocoder.yudao.module.system.enums.download.DownloadTypeEnum;
import cn.iocoder.yudao.module.system.enums.sms.SmsNodeEnum;
import cn.iocoder.yudao.module.wealth.vo.receivable.ReceivableBoxReportQueryVO;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
......@@ -359,4 +360,22 @@ public class BoxController {
fileMakeApi.sendFileMake(reqDTO);
return success("");
}
@GetMapping("/export-shipment-summary/new")
@ApiOperation("导出自编号汇总列表 Excel")
@OperateLog(type = EXPORT)
public CommonResult exportOrderSummaryNew(ReceivableBoxReportQueryVO query, HttpServletResponse response) throws Exception {
FileMakeReqDTO reqDTO = new FileMakeReqDTO();
JSONObject jsonObject = new JSONObject();
jsonObject.put("query", JSONObject.toJSONString(query));
reqDTO.setType(DownloadTypeEnum.SHIPMENT_SUMMERY_EXCEL_EXPORT_NEW.getType());
reqDTO.setName("新出货应收报表");
reqDTO.setFileSuffix("xlsx");
reqDTO.setTemporaryFile(true);
reqDTO.setUserType(2);
reqDTO.setLang(I18nMessage.getLang());
reqDTO.setRequestParams(jsonObject.toJSONString());
fileMakeApi.sendFileMake(reqDTO);
return success("");
}
}
......@@ -187,6 +187,11 @@ public enum DownloadTypeEnum implements IntArrayValuable {
*/
CUSTOMER_FOLLOWUP_EXPORT(34),
/**
* 新应收报表导出
*/
SHIPMENT_SUMMERY_EXCEL_EXPORT_NEW(35)
// ....自己补充
;
......
......@@ -347,6 +347,10 @@ public class DownloadLogServiceImpl extends AbstractService<DownloadLogMapper, D
case SHIPMENT_SUMMERY_EXCEL_EXPORT:
shipmentSummeryExcelExportPushEvent(downloadLog);
break;
//新自编号应收报表导出
case SHIPMENT_SUMMERY_EXCEL_EXPORT_NEW:
shipmentSummeryNewExcelExportPushEvent(downloadLog);
break;
case SHIPMENT_SEA_PRELOAD_EXCEL_EXPORT:
//海运预装单导出
shipmentSeaPreloadExcelExportPushEvent(downloadLog);
......@@ -465,6 +469,20 @@ public class DownloadLogServiceImpl extends AbstractService<DownloadLogMapper, D
downloadLog.setFileId(event.getFileId());
}
private void shipmentSummeryNewExcelExportPushEvent(DownloadLogDO downloadLog) {
ShipmentSummeryNewExcelExportPushEvent event = new ShipmentSummeryNewExcelExportPushEvent();
event.setUserId(downloadLog.getUserId());
event.setUserType(downloadLog.getUserType());
event.setLang(downloadLog.getLang());
event.setRequestParams(downloadLog.getRequestParams());
applicationContext.publishEvent(event);
downloadLog.setFileName(event.getFileName());
downloadLog.setPath(event.getPath());
downloadLog.setDownloadUrl(event.getUrl());
downloadLog.setResult(event.getResult());
downloadLog.setFileId(event.getFileId());
}
private void airBillReceivableExcelExportPushEvent(DownloadLogDO downloadLog) {
AirBillReceivableExcelExportPushEvent event = new AirBillReceivableExcelExportPushEvent();
event.setUserId(downloadLog.getUserId());
......
......@@ -231,4 +231,8 @@ public class ReceiptDO extends BaseDO {
* 生成路径
*/
private Integer generatePath;
/**
* 核销误差兑额外费用主币种金额
*/
private String writeOffDiffMainCurrency;
}
......@@ -34,6 +34,10 @@ public class ReceiptItemDO extends BaseDO {
* 收款单id
*/
private Long receiptId;
/**
* 收款账号id
*/
private Long accountId;
/**
* 收款账号
*/
......
......@@ -173,5 +173,16 @@ public class ReceivableDO extends BaseDO {
* 备注
*/
private String remark;
/**
* 目的国相关币种id(用于报表,跟费用类型相关)
*/
private Long destCountryCurrencyId;
/**
* 目的国相关汇率(用于报表,跟费用类型相关)
*/
private BigDecimal destCountryRate;
/**
* 额外费用副币种汇率(用于报表,跟费用类型相关)
*/
private BigDecimal destCountrySubRate;
}
......@@ -16,7 +16,10 @@ import java.math.BigDecimal;
public class ReceivableWriteOffRecordDO extends BaseDO {
@TableId
private Long id;
private Long orderId;
private Long receivableId;
private Long receiptItemId;
private BigDecimal writeOffAmount;
private BigDecimal receivableWriteOffAmount;
private Integer incomeBelong;
}
package cn.iocoder.yudao.module.wealth.dal.mysql.payment;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQuery;
import cn.iocoder.yudao.framework.mybatis.core.mapper.AbstractMapper;
......@@ -11,6 +12,7 @@ import cn.iocoder.yudao.module.wealth.vo.payment.*;
/**
* 付款单 Mapper
*
* @author 郑屹
*/
@Mapper
......@@ -18,34 +20,38 @@ public interface PaymentMapper extends AbstractMapper<PaymentDO> {
@Override
default PageResult<PaymentDO> selectPage(PageVO page, Object object) {
if (object instanceof PaymentQueryVO) {
PaymentQueryVO vo = (PaymentQueryVO)object;
PaymentQueryVO vo = (PaymentQueryVO) object;
return selectPage(page, new LambdaQuery<PaymentDO>()
.eqIfPresent(PaymentDO::getPaymentNo, vo.getPaymentNo())
.eqIfPresent(PaymentDO::getDepartmentId, vo.getDepartmentId())
.likeIfPresent(PaymentDO::getDepartmentName, vo.getDepartmentName())
.eqIfPresent(PaymentDO::getSalesmanId, vo.getSalesmanId())
.likeIfPresent(PaymentDO::getSalesmanName, vo.getSalesmanName())
.eqIfPresent(PaymentDO::getSupplierId, vo.getSupplierId())
.likeIfPresent(PaymentDO::getSupplierName, vo.getSupplierName())
.eqIfPresent(PaymentDO::getSupplierBank, vo.getSupplierBank())
.eqIfPresent(PaymentDO::getSupplierBankAccount, vo.getSupplierBankAccount())
.eqIfPresent(PaymentDO::getApplicationAt, vo.getApplicationAt())
.eqIfPresent(PaymentDO::getLatestPayAt, vo.getLatestPayAt())
.eqIfPresent(PaymentDO::getAccountNumber, vo.getAccountNumber())
.eqIfPresent(PaymentDO::getInvoiceStatus, vo.getInvoiceStatus())
.eqIfPresent(PaymentDO::getInvoiceNumber, vo.getInvoiceNumber())
.eqIfPresent(PaymentDO::getState, vo.getState())
.eqIfPresent(PaymentDO::getPaymentAddId, vo.getPaymentAddId())
.eqIfPresent(PaymentDO::getPaymentAddBy, vo.getPaymentAddBy())
.eqIfPresent(PaymentDO::getReviewId, vo.getReviewId())
.likeIfPresent(PaymentDO::getReviewName, vo.getReviewName())
.eqIfPresent(PaymentDO::getWriteOffId, vo.getWriteOffId())
.likeIfPresent(PaymentDO::getWriteOffName, vo.getWriteOffName())
.eqIfPresent(PaymentDO::getReviewAt, vo.getReviewAt())
.eqIfPresent(PaymentDO::getWriteOffAt, vo.getWriteOffAt())
.eqIfPresent(PaymentDO::getSource, vo.getSource())
.eqIfPresent(PaymentDO::getSettlementType, vo.getSettlementType())
.betweenIfPresent(PaymentDO::getCreateTime, vo.getBeginCreateTime(), vo.getEndCreateTime())
.eqIfPresent(PaymentDO::getPaymentNo, vo.getPaymentNo())
.eqIfPresent(PaymentDO::getDepartmentId, vo.getDepartmentId())
.likeIfPresent(PaymentDO::getDepartmentName, vo.getDepartmentName())
.eqIfPresent(PaymentDO::getSalesmanId, vo.getSalesmanId())
.inIfPresent(PaymentDO::getSalesmanId, vo.getSalesmanIdList())
.likeIfPresent(PaymentDO::getSalesmanName, vo.getSalesmanName())
.eqIfPresent(PaymentDO::getSupplierId, vo.getSupplierId())
.inIfPresent(PaymentDO::getSupplierId, vo.getSupplierIdList())
.likeIfPresent(PaymentDO::getSupplierName, vo.getSupplierName())
.eqIfPresent(PaymentDO::getSupplierBank, vo.getSupplierBank())
.eqIfPresent(PaymentDO::getSupplierBankAccount, vo.getSupplierBankAccount())
.eqIfPresent(PaymentDO::getApplicationAt, vo.getApplicationAt())
.eqIfPresent(PaymentDO::getLatestPayAt, vo.getLatestPayAt())
.eqIfPresent(PaymentDO::getAccountNumber, vo.getAccountNumber())
.eqIfPresent(PaymentDO::getInvoiceStatus, vo.getInvoiceStatus())
.inIfPresent(PaymentDO::getInvoiceStatus, vo.getInvoiceStatusList())
.eqIfPresent(PaymentDO::getInvoiceNumber, vo.getInvoiceNumber())
.eqIfPresent(PaymentDO::getState, vo.getState())
.inIfPresent(PaymentDO::getState, vo.getStateList())
.eqIfPresent(PaymentDO::getPaymentAddId, vo.getPaymentAddId())
.eqIfPresent(PaymentDO::getPaymentAddBy, vo.getPaymentAddBy())
.eqIfPresent(PaymentDO::getReviewId, vo.getReviewId())
.likeIfPresent(PaymentDO::getReviewName, vo.getReviewName())
.eqIfPresent(PaymentDO::getWriteOffId, vo.getWriteOffId())
.likeIfPresent(PaymentDO::getWriteOffName, vo.getWriteOffName())
.eqIfPresent(PaymentDO::getReviewAt, vo.getReviewAt())
.eqIfPresent(PaymentDO::getWriteOffAt, vo.getWriteOffAt())
.eqIfPresent(PaymentDO::getSource, vo.getSource())
.eqIfPresent(PaymentDO::getSettlementType, vo.getSettlementType())
.betweenIfPresent(PaymentDO::getCreateTime, vo.getBeginCreateTime(), vo.getEndCreateTime())
.orderByDesc(PaymentDO::getId));
}
......@@ -55,34 +61,34 @@ public interface PaymentMapper extends AbstractMapper<PaymentDO> {
@Override
default List<PaymentDO> selectList(Object object) {
if (object instanceof PaymentQueryVO) {
PaymentQueryVO vo = (PaymentQueryVO)object;
PaymentQueryVO vo = (PaymentQueryVO) object;
return selectList(new LambdaQuery<PaymentDO>()
.eqIfPresent(PaymentDO::getPaymentNo, vo.getPaymentNo())
.eqIfPresent(PaymentDO::getDepartmentId, vo.getDepartmentId())
.likeIfPresent(PaymentDO::getDepartmentName, vo.getDepartmentName())
.eqIfPresent(PaymentDO::getSalesmanId, vo.getSalesmanId())
.likeIfPresent(PaymentDO::getSalesmanName, vo.getSalesmanName())
.eqIfPresent(PaymentDO::getSupplierId, vo.getSupplierId())
.likeIfPresent(PaymentDO::getSupplierName, vo.getSupplierName())
.eqIfPresent(PaymentDO::getSupplierBank, vo.getSupplierBank())
.eqIfPresent(PaymentDO::getSupplierBankAccount, vo.getSupplierBankAccount())
.eqIfPresent(PaymentDO::getApplicationAt, vo.getApplicationAt())
.eqIfPresent(PaymentDO::getLatestPayAt, vo.getLatestPayAt())
.eqIfPresent(PaymentDO::getAccountNumber, vo.getAccountNumber())
.eqIfPresent(PaymentDO::getInvoiceStatus, vo.getInvoiceStatus())
.eqIfPresent(PaymentDO::getInvoiceNumber, vo.getInvoiceNumber())
.eqIfPresent(PaymentDO::getState, vo.getState())
.eqIfPresent(PaymentDO::getPaymentAddId, vo.getPaymentAddId())
.eqIfPresent(PaymentDO::getPaymentAddBy, vo.getPaymentAddBy())
.eqIfPresent(PaymentDO::getReviewId, vo.getReviewId())
.likeIfPresent(PaymentDO::getReviewName, vo.getReviewName())
.eqIfPresent(PaymentDO::getWriteOffId, vo.getWriteOffId())
.likeIfPresent(PaymentDO::getWriteOffName, vo.getWriteOffName())
.eqIfPresent(PaymentDO::getReviewAt, vo.getReviewAt())
.eqIfPresent(PaymentDO::getWriteOffAt, vo.getWriteOffAt())
.eqIfPresent(PaymentDO::getSource, vo.getSource())
.eqIfPresent(PaymentDO::getSettlementType, vo.getSettlementType())
.betweenIfPresent(PaymentDO::getCreateTime, vo.getBeginCreateTime(), vo.getEndCreateTime())
.eqIfPresent(PaymentDO::getPaymentNo, vo.getPaymentNo())
.eqIfPresent(PaymentDO::getDepartmentId, vo.getDepartmentId())
.likeIfPresent(PaymentDO::getDepartmentName, vo.getDepartmentName())
.eqIfPresent(PaymentDO::getSalesmanId, vo.getSalesmanId())
.likeIfPresent(PaymentDO::getSalesmanName, vo.getSalesmanName())
.eqIfPresent(PaymentDO::getSupplierId, vo.getSupplierId())
.likeIfPresent(PaymentDO::getSupplierName, vo.getSupplierName())
.eqIfPresent(PaymentDO::getSupplierBank, vo.getSupplierBank())
.eqIfPresent(PaymentDO::getSupplierBankAccount, vo.getSupplierBankAccount())
.eqIfPresent(PaymentDO::getApplicationAt, vo.getApplicationAt())
.eqIfPresent(PaymentDO::getLatestPayAt, vo.getLatestPayAt())
.eqIfPresent(PaymentDO::getAccountNumber, vo.getAccountNumber())
.eqIfPresent(PaymentDO::getInvoiceStatus, vo.getInvoiceStatus())
.eqIfPresent(PaymentDO::getInvoiceNumber, vo.getInvoiceNumber())
.eqIfPresent(PaymentDO::getState, vo.getState())
.eqIfPresent(PaymentDO::getPaymentAddId, vo.getPaymentAddId())
.eqIfPresent(PaymentDO::getPaymentAddBy, vo.getPaymentAddBy())
.eqIfPresent(PaymentDO::getReviewId, vo.getReviewId())
.likeIfPresent(PaymentDO::getReviewName, vo.getReviewName())
.eqIfPresent(PaymentDO::getWriteOffId, vo.getWriteOffId())
.likeIfPresent(PaymentDO::getWriteOffName, vo.getWriteOffName())
.eqIfPresent(PaymentDO::getReviewAt, vo.getReviewAt())
.eqIfPresent(PaymentDO::getWriteOffAt, vo.getWriteOffAt())
.eqIfPresent(PaymentDO::getSource, vo.getSource())
.eqIfPresent(PaymentDO::getSettlementType, vo.getSettlementType())
.betweenIfPresent(PaymentDO::getCreateTime, vo.getBeginCreateTime(), vo.getEndCreateTime())
.orderByDesc(PaymentDO::getId));
}
......
......@@ -15,7 +15,7 @@ public interface BankReceiptDetailsMapper {
IPage<BankIncomeItemResp> getBankIncomeItemPage(IPage<BankIncomeItemResp> page, @Param("req") BankIncomeItemReq req);
List<CurrencyAmount> calculateAccountBalance(String accountNo);
List<CurrencyAmount> calculateAccountBalance(Long accountId);
List<CurrencyAmount> calculateCurrentAmount(@Param("req") BankIncomeItemReq req);
......
......@@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.wealth.vo.receiptItem.CurrencyAmount;
import cn.iocoder.yudao.module.wealth.vo.receiptItem.ReceiptItemQueryVO;
import cn.iocoder.yudao.module.wealth.vo.receiptItem.ReceiptItemReviewPageReqVO;
import cn.iocoder.yudao.module.wealth.vo.receiptItem.ReceiptItemReviewPageVO;
import cn.iocoder.yudao.module.wealth.vo.receivable.ReceivableIncomeBelong;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
......@@ -17,6 +18,7 @@ import org.apache.ibatis.annotations.Select;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;
/**
* 收款单明细 Mapper
......@@ -99,4 +101,6 @@ public interface ReceiptItemMapper extends AbstractMapper<ReceiptItemDO> {
List<CurrencyAmount> countTotalActualAmount();
List<CurrencyAmount> countTotalWriteOffAmount();
List<ReceivableIncomeBelong> selectAllWriteOffItemByOrders(@Param("orderIds") Set<Long> orderIds);
}
......@@ -12,6 +12,7 @@ import org.apache.ibatis.annotations.*;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Set;
/**
* 应收款 Mapper
......@@ -86,91 +87,6 @@ public interface ReceivableMapper extends AbstractMapper<ReceivableDO> {
return null;
}
@ResultType(ReceivableBackVO.class)
@Select({
"<script>",
"select r.*, ",
"o.marks, ",
"o.`status`, ",
"o.abnormal_state, ",
"o.in_warehouse_state, ",
"o.shipment_state, ",
"o.pick_state, ",
"o.to_warehouse_state, ",
"o.tidan_no, ",
"o.container_number as container_number, ",
"nor.name as consignor_name, ",
"nor.phone as consignor_phone, ",
"nor.customer_id as consignor_id, ",
"nee.name as consignee_name, ",
"nee.customer_id as consignee_id, ",
"nee.phone as consignee_phone",
"from ecw_receivable r ",
"left join ecw_order o on o.order_id = r.order_id",
"left join ecw_warehouse_line de on o.line_id = de.id ",
"left join ecw_order_consignor nor on nor.order_id = o.order_id ",
"left join ecw_order_consignee nee on nee.order_id = o.order_id ",
"where r.deleted = 0 and r.receipt_id is null and o.order_id is not null",
"<when test = 'query.status != null'>",
"AND o.`status` = #{query.status}",
"</when>",
"<when test = 'query.isCargoControl != null'>",
"AND (o.`is_cargo_control` = #{query.isCargoControl} or o.`is_cargo_control` = #{query.isCargoControl})",
"</when>",
"<when test = 'query.customsType != null'>",
"AND o.`customs_type` = #{query.customsType}",
"</when>",
"<when test = 'query.transportId != null'>",
"AND o.`transport_id` = #{query.transportId}",
"</when>",
"<when test = 'query.isCargoControl != null '>",
"AND o.`is_cargo_control` = #{query.isCargoControl}",
"</when>",
"<when test = 'query.marks != null and query.marks != \"\" '>",
"AND o.`marks` like concat('%',concat(#{query.marks},'%'))",
"</when>",
"<when test = 'query.departureId != null '>",
"AND de.`start_warehouse_id` = #{query.departureId}",
"</when>",
"<when test = 'query.objectiveId != null '>",
"AND de.`dest_warehouse_id` = #{query.objectiveId}",
"</when>",
"<when test = 'query.title != null and query.title != \"\" '>",
"AND concat(r.`title_zh`, r.`title_en`) like concat('%',concat(#{query.title},'%'))",
"</when>",
"<when test = 'query.consignorNameOrPhone != null and query.consignorNameOrPhone != \"\" '>",
"AND concat(nor.`name`, nor.`phone`,nor.`company`) like concat('%',concat(#{query.consignorNameOrPhone},'%'))",
"</when>",
"<when test = 'query.consigneeNameOrPhone != null and query.consigneeNameOrPhone != \"\" '>",
"AND concat(nee.`name`, nee.`phone`,nee.`company`) like concat('%',concat(#{query.consigneeNameOrPhone},'%'))",
"</when>",
"<when test = 'query.orderNo != null and query.orderNo != \"\" '>",
"AND r.`order_no` like concat('%',concat(#{query.orderNo},'%'))",
"</when>",
"<when test = 'query.tidanNo != null and query.tidanNo != \"\" '>",
"AND o.`tidan_no` like concat('%',concat(#{query.tidanNo},'%'))",
"</when>",
"<when test = 'query.receiptNo != null and query.receiptNo != \"\" '>",
"AND r.`receipt_no` like concat('%',concat(#{query.receiptNo},'%'))",
"</when>",
"<when test = 'query.state != null '>",
"AND r.`state` #{query.state}",
"</when>",
"<when test = 'query.beginCreateTime != null and query.endCreateTime != null '>",
"AND r.`create_time` between #{query.beginCreateTime} and #{query.endCreateTime}",
"</when>",
"<when test = 'query.feeType != null'>",
"AND r.`fee_type` = #{query.feeType}",
"</when>",
"<when test = 'query.customerId != null'>",
"AND o.`customer_id` = #{query.customerId}",
"</when>",
"<when test = 'query.containerNumber != null'>",
"AND o.`container_number` = #{query.containerNumber}",
"</when>",
"group by r.id",
"</script>"
})
IPage<ReceivableBackVO> receivablePage(@Param("mpPage") IPage<ReceivableBackVO> mpPage, @Param("query") ReceivableQueryVO query);
......@@ -428,4 +344,14 @@ public interface ReceivableMapper extends AbstractMapper<ReceivableDO> {
IPage<BatchGenReceiptReceivablePageVO> batchGenReceiptReceivablePage(IPage<BatchGenReceiptReceivablePageVO> mpPage, @Param("query") BatchGenReceiptReceivablePageQueryVO query);
List<CurrencyAmount> batchGenReceiptReceivablAmount(@Param("query") BatchGenReceiptReceivablePageQueryVO query);
List<ReceivableBoxReportPageVO> getReceivableBoxPage(@Param("query") ReceivableBoxReportQueryVO query);
List<ReceivebleBoxRelationOrder> getReceivableBoxRelationOrders(@Param("shipmentIdList") List<Long> shipmentIdList);
List<ReceivableDO> selectBoxReceivablesByOrderIds(@Param("orderIds") Set<Long> orderIds);
List<Long> getAllBoxId();
List<Long> getDestWarehouseIdListByDestCity(@Param("destCity") List<Long> destCity);
}
package cn.iocoder.yudao.module.wealth.enums;
public interface BoxReportConstant {
/**
* 自编号数据汇总缓存key
*/
String BOX_AMOUNT_CACHE = "wealth:report:boxAmount:";
/**
* 报表查询结果缓存key
*/
String BOX_REPORT_QUERY_CACHE = "wealth:report:query";
/**
* 报表查询条件缓存key
*/
String BOX_REPORT_QUERY_CONDITION_CACHE = "wealth:report:condition";
}
......@@ -5,6 +5,8 @@ import cn.iocoder.yudao.module.bpm.api.BpmCreateServiceFactory;
import cn.iocoder.yudao.module.bpm.enums.BpmProcessInstanceResultEnum;
import cn.iocoder.yudao.module.bpm.enums.WorkFlowEmus;
import cn.iocoder.yudao.module.bpm.resp.TaskResp;
import cn.iocoder.yudao.module.ecw.api.bank.BankApi;
import cn.iocoder.yudao.module.ecw.api.bank.dto.BankAccountDTO;
import cn.iocoder.yudao.module.wealth.dal.dataobject.receipt.ReceiptDO;
import cn.iocoder.yudao.module.wealth.dal.dataobject.receiptApproval.ReceiptApprovalDO;
import cn.iocoder.yudao.module.wealth.dal.dataobject.receiptItem.ReceiptItemDO;
......@@ -57,6 +59,8 @@ public class FinanceReceiptApproveService {
private ReceivableService receivableService;
@Resource
private ApplicationContext applicationContext;
@Resource
private BankApi bankApi;
@Transactional
public void financeApproveCallBack(String bmpKey, String businessKey, Integer result) {
......@@ -216,40 +220,6 @@ public class FinanceReceiptApproveService {
receiptService.recordLog(receiptDO.getId(), ReceiptLinkEnum.REJECT_WRITE_OFF_RECEIPT, comment, WorkFlowEmus.FINANCE_RECEIPT_WRITE_OFF_NO.getValue());
} else if (StrUtil.equals(WorkFlowEmus.FINANCE_RECEIPT_ITEM_WRITE_OFF.getKey(), bmpKey)) {
//收款单明细核销审核
//if (null == receiptApprovalDO.getReceiptItemId()) {
// throw exception(RECEIPT_ITEM_NOT_FOUND);
//}
//ReceiptItemDO receiptItemDO = receiptItemMapper.selectById(receiptApprovalDO.getReceiptItemId());
//if (null == receiptItemDO) {
// throw exception(RECEIPT_ITEM_NOT_FOUND);
//}
//ReceiptItemDO updateReceiptItem = new ReceiptItemDO();
//updateReceiptItem.setId(receiptItemDO.getId());
//updateReceiptItem.setBmpStatus(result);
//if (result == BpmProcessInstanceResultEnum.APPROVE.getResult()) {
// updateReceiptItem.setStatus(ReceiptItemStatusEnum.WRITE_OFF.getValue());
// updateReceiptItem.setApprovalTime(new Date());
// //判断收款单状态如果是待核销状态-变成部分核销状态,其它 状态不变
// ReceiptDO receiptDO = receiptMapper.selectById(receiptItemDO.getReceiptId());
// if (null != receiptDO && receiptDO.getState().equals(ReceiptStatusEnum.WRITE_OFF_WAITING.getValue())) {
// ReceiptDO updateReceipt = new ReceiptDO();
// updateReceipt.setId(receiptDO.getId());
// updateReceipt.setState(ReceiptStatusEnum.WRITE_OFF_PART_ING.getValue());
// receiptMapper.updateById(updateReceipt);
//
// //更新收该收款单下的应收为收款中状态
// LambdaUpdateWrapper<ReceivableDO> lambdaUpdateWrapper = new LambdaUpdateWrapper();
// lambdaUpdateWrapper.eq(ReceivableDO::getReceiptId, receiptDO.getId());
// lambdaUpdateWrapper.set(ReceivableDO::getState, 1);
// receivableService.update(lambdaUpdateWrapper);
// }
// receiptService.updateReceiptItemStatus(receiptItemDO.getReceiptId());
//} else if (result == BpmProcessInstanceResultEnum.REJECT.getResult()) {
// updateReceiptItem.setStatus(ReceiptItemStatusEnum.WRITE_OFF_APPROVE_REJECT.getValue());
//} else if (result == BpmProcessInstanceResultEnum.CANCEL.getResult()) {
// updateReceiptItem.setStatus(ReceiptItemStatusEnum.DRAFT.getValue());
//}
//receiptItemMapper.updateById(updateReceiptItem);
applicationContext.publishEvent(new ReceiptItemWriteOffEvent(receiptApprovalDO.getReceiptItemId(), result, comment));
} else if (StrUtil.equals(WorkFlowEmus.FINANCE_RECEIPT_ITEM_WRITE_OFF_NO.getKey(), bmpKey)) {
//收款单明细核销反审核
......@@ -264,7 +234,7 @@ public class FinanceReceiptApproveService {
updateWrapper.eq(ReceiptItemDO::getId, receiptItemDO.getId());
updateWrapper.set(ReceiptItemDO::getBmpStatus, result);
if (result == BpmProcessInstanceResultEnum.APPROVE.getResult()) {
updateWrapper.set(ReceiptItemDO::getStatus, ReceiptItemStatusEnum.WRITE_OFF.getValue());
updateWrapper.set(ReceiptItemDO::getStatus, ReceiptItemStatusEnum.DRAFT.getValue());
updateWrapper.set(ReceiptItemDO::getApprovalTime, null);
receiptItemMapper.update(null, updateWrapper);
//需要根据应收明细核销状态 变更成部分核销或者待核销
......@@ -293,6 +263,13 @@ public class FinanceReceiptApproveService {
}
receivableService.updateBatchById(receivableDOS);
receiptService.updateReceiptItemStatus(receiptItemDO.getReceiptId());
// 更新银行账户余额
bankApi.updateBankAccountBalance(BankAccountDTO.builder()
.id(receiptItemDO.getAccountId())
.baAccountName(receiptItemDO.getAccountName())
.baAccountNum(receiptItemDO.getAccountNo())
.baBankName(receiptItemDO.getAccountBankName())
.baBalance(receiptItemDO.getAmount()).build(), false);
} else if (result == BpmProcessInstanceResultEnum.REJECT.getResult()) {
updateWrapper.set(ReceiptItemDO::getStatus, ReceiptItemStatusEnum.WRITE_OFF.getValue());
receiptItemMapper.update(null, updateWrapper);
......
......@@ -56,7 +56,7 @@ public class BankReceiptDetailsImpl implements BankReceiptDetailsService {
}
r.setAttrList(getFileList(r.getAttr()));
if(r.getCreateBpm()==null|| r.getCreator().isEmpty()) {
if (r.getCreateBpm() == null || r.getCreator().isEmpty()) {
r.setCreateBpm("");
} else {
Long l2 = Long.parseLong(r.getCreateBpm());
......@@ -70,6 +70,9 @@ public class BankReceiptDetailsImpl implements BankReceiptDetailsService {
@Override
public BankIncomePageResult<BankIncomeItemResp> getBankIncomeItemPage(BankIncomeItemReq req) {
if (req.getIsIncome() != null && req.getIsIncome() == 1) {
return BankIncomePageResult.empty();
}
IPage<BankIncomeItemResp> mpPage = MyBatisUtils.buildPage(req);
bankReceiptDetailsMapper.getBankIncomeItemPage(mpPage, req);
if (mpPage.getTotal() == 0) {
......@@ -84,7 +87,7 @@ public class BankReceiptDetailsImpl implements BankReceiptDetailsService {
if (accountBalanceMap.containsKey(record.getAccountNo())) {
record.setAccountBalance(accountBalanceMap.get(record.getAccountNo()));
} else {
record.setAccountBalance(bankReceiptDetailsMapper.calculateAccountBalance(record.getAccountNo()));
record.setAccountBalance(bankReceiptDetailsMapper.calculateAccountBalance(record.getAccountId()));
accountBalanceMap.put(record.getAccountNo(), record.getAccountBalance());
}
List<ReceiptRelationOrderInfoVO> orderInfoByReceiptId = receiptMapper.getOrderInfoByReceiptId(Long.parseLong(record.getReceiptId()));
......
......@@ -28,7 +28,7 @@ public interface ReceiptItemService extends IService<ReceiptItemDO> {
* @param createReqVO 创建信息
* @return 编号
*/
Long createReceiptItem(@Valid ReceiptItemCreateReqVO createReqVO);
Long createReceiptItem(@Valid ReceiptItemCreateReqVO createReqVO,boolean isBatch);
/**
* 更新收款单明细
......@@ -120,9 +120,6 @@ public interface ReceiptItemService extends IService<ReceiptItemDO> {
*/
void cancelFinanceReceiptItemWriteOffNo(FinanceReceiptItemCancelVo financeReceiptItemVo);
BigDecimal getWriteOffAmountByReceiptId( Long receiptId);
List<ReceiptItemBatchRespVO> receiptItemImport(List<ReceiptItemBatchCreateReqVO> list, Boolean ignoreItem);
ReceiptItemBackVO getReceiptItemDetail(Long id);
......
......@@ -271,7 +271,7 @@ public interface ReceivableService extends IService<ReceivableDO> {
Long getDestCountryCurrencyId(Long orderId);
void createWriteOffRecord(ReceivableWriteOffReqVO receivableWriteOffReqVO, ReceiptItemDO receiptItem);
void createWriteOffRecord(ReceivableWriteOffReqVO receivableWriteOffReqVO, ReceiptItemDO receiptItem, Integer incomeBelong);
ReceivableWriteOffRecordDO getReceivableWriteOffRecord(Long receivableId, Long receiptItemId);
......@@ -282,4 +282,8 @@ public interface ReceivableService extends IService<ReceivableDO> {
List<ReceivableInItemVO> getReceivableByReceiptItem(Long receiptItemId);
ReceivablePageResult<BatchGenReceiptReceivablePageVO> batchGenReceiptReceivablePage(BatchGenReceiptReceivablePageQueryVO query, PageVO page);
ReceivableBoxReportVO getReceivableBoxReport(@Valid ReceivableBoxReportQueryVO query, PageVO page);
void updateBoxAmountCache(List<Long> shipmentIdList, boolean isForceUpdate);
}
......@@ -39,6 +39,9 @@ public class CommissionPayableQueryVO {
@ApiModelProperty(value = "佣金费用类型(字典:commission_fee_type)")
private Integer feeType;
@ApiModelProperty(value = "佣金费用类型")
private List<Integer> feeTypeList;
@ApiModelProperty(value = "金额")
private java.math.BigDecimal totalAmount;
......@@ -60,6 +63,9 @@ public class CommissionPayableQueryVO {
@ApiModelProperty(value = "收款状态(0未付款,1付款中,2已付款)")
private Integer state;
@ApiModelProperty(value = "收款状态(0未付款,1付款中,2已付款)")
private List<Integer> stateList;
@ApiModelProperty(value = "数据来源(pc端,mobile端)")
private String source;
......@@ -82,12 +88,18 @@ public class CommissionPayableQueryVO {
@ApiModelProperty(value = "始发地仓库ID")
private Long startWarehouseId;
@ApiModelProperty(value = "始发地仓库ID")
private List<Long> startWarehouseIdList;
@ApiModelProperty(value = "目的地仓库ID")
private Long destWarehouseId;
@ApiModelProperty(value = "目的地仓库ID")
private List<Long> destWarehouseIdList;
@ApiModelProperty(value = "运输方式")
private Long transportId;
@ApiModelProperty(value = "运输方式")
private List<Long> transportIdList;
@ApiModelProperty(value = "搜索关键字(包括:客户名称、手机号、客户编号)")
private String searchKey;
......
......@@ -24,12 +24,18 @@ public class CommissionPaymentQueryVO {
@ApiModelProperty(value = "业务员")
private Long salesmanId;
@ApiModelProperty(value = "业务员id")
private List<Long> salesmanIdList;
@ApiModelProperty(value = "业务员名称")
private String salesmanName;
@ApiModelProperty(value = "客户id")
private Long customerId;
@ApiModelProperty(value = "客户id集合")
private List<Long> customerIdList;
@ApiModelProperty(value = "客户名称")
private String customerName;
......@@ -57,12 +63,16 @@ public class CommissionPaymentQueryVO {
@ApiModelProperty(value = "发票状态(0未开票,1已开票)")
private Integer invoiceStatus;
private List<Integer> invoiceStatusList;
@ApiModelProperty(value = "发票号")
private String invoiceNumber;
@ApiModelProperty(value = "付款单状态(1待审核,2已审核待核销,3已核销)")
private Integer state;
private List<Integer> stateList;
@ApiModelProperty(value = "付款单添加人id")
private Long paymentAddId;
......
......@@ -7,9 +7,9 @@ import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Data
@ApiModel("管理后台 - 应付款查询 VO")
......@@ -38,6 +38,9 @@ public class PayableQueryVO {
@ApiModelProperty(value = "费用类型(字典:payable_fee_type)")
private Long feeType;
@ApiModelProperty(value = "费用类型(字典:payable_fee_type)")
private List<Long> feeTypeList;
@ApiModelProperty(value = "金额")
private java.math.BigDecimal totalAmount;
......@@ -90,20 +93,30 @@ public class PayableQueryVO {
@ApiModelProperty(value = "运输方式id")
private String transportId;
@ApiModelProperty(value = "运输方式id")
private List<String> transportIdList;
@ExcelProperty("始发地ID")
@ApiModelProperty(value = "始发地ID")
private String departureId;
@ApiModelProperty(value = "始发地ID")
private List<String> departureIdList;
@ExcelProperty("目的地ID")
@ApiModelProperty(value = "目的地ID")
private String objectiveId;
@ApiModelProperty(value = "目的地ID")
private List<String> objectiveIdList;
@ApiModelProperty(value = "客户名称")
private String customerName;
/*
时间节点查询类型
*/
@ApiModelProperty(value = "时间节点查询类型")
private int dateType;
@ApiModelProperty(value = "时间节点查询类型")
private List<Integer> dateTypeList;
}
......@@ -24,12 +24,18 @@ public class PaymentQueryVO {
@ApiModelProperty(value = "业务员")
private Long salesmanId;
@ApiModelProperty(value = "业务员")
private List<Long> salesmanIdList;
@ApiModelProperty(value = "业务员名称")
private String salesmanName;
@ApiModelProperty(value = "供应商id")
private Long supplierId;
@ApiModelProperty(value = "供应商id")
private List<Long> supplierIdList;
@ApiModelProperty(value = "供应商名称")
private String supplierName;
......@@ -53,12 +59,18 @@ public class PaymentQueryVO {
@ApiModelProperty(value = "发票状态(0未开票,1已开票)")
private Integer invoiceStatus;
@ApiModelProperty(value = "发票状态(0未开票,1已开票)")
private List<Integer> invoiceStatusList;
@ApiModelProperty(value = "发票号")
private String invoiceNumber;
@ApiModelProperty(value = "付款单状态(1待审核,2已审核待核销,3已核销)")
private Integer state;
@ApiModelProperty(value = "付款单状态(1待审核,2已审核待核销,3已核销)")
private List<Integer> stateList;
@ApiModelProperty(value = "付款单添加人id")
private Long paymentAddId;
......
......@@ -180,4 +180,7 @@ public class ReceiptBackVO {
@ApiModelProperty(value = "实收日期")
private Date payedAt;
@ApiModelProperty(value = "核销误差兑额外费用主币种金额")
private String writeOffDiffMainCurrency;
}
......@@ -27,12 +27,18 @@ public class ReceiptQueryVO {
@ApiModelProperty(value = "业务员")
private Long salesmanId;
@ApiModelProperty(value = "业务员")
private List<Long> salesmanIdList;
@ApiModelProperty(value = "业务员名称")
private String salesmanName;
@ApiModelProperty(value = "客户id")
private Long customerId;
@ApiModelProperty(value = "客户id")
private List<Long> customerIdList;
@ApiModelProperty(value = "客户名称")
private String customerName;
......@@ -121,6 +127,9 @@ public class ReceiptQueryVO {
@ApiModelProperty(value = "状态: 1待核销,2 已核销,3已核销待开票,4已开票")
private Integer state;
@ApiModelProperty(value = "状态: 1待核销,2 已核销,3已核销待开票,4已开票")
private List<Integer> stateList;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "核销时间")
private Date writeOffAt;
......
......@@ -29,6 +29,10 @@ public class ReceiptItemBatchCreateReqVO {
@ExcelProperty("收款日期")
private String payDate;
@ApiModelProperty(value = "收款账号id")
@ExcelIgnore
private Long accountId;
@ApiModelProperty(value = "收款账号")
@ExcelProperty("收款账号")
private String payAccount;
......
......@@ -24,6 +24,9 @@ public class BankIncomeItemResp {
@ApiModelProperty(value = "0收/1支,暂时没支")
private Integer isIncome;
@ApiModelProperty(value = "收款账号id")
private Long accountId;
@ApiModelProperty(value = "收款账号")
private String accountNo;
......
......@@ -23,6 +23,9 @@ public class ReceiptItemBaseVO {
@ApiModelProperty(value = "收款单id")
private Long receiptId;
@ApiModelProperty(value = "收款账号id")
private Long accountId;
@ApiModelProperty(value = "收款账号")
private String accountNo;
......
......@@ -40,6 +40,9 @@ public class BatchGenReceiptPageVO {
@ApiModelProperty(value = "付款人id")
private Long payerId;
@ApiModelProperty(value = "是否开票 0否1是")
private Integer openInvoice;
@ApiModelProperty(value = "客户编号")
private String customerNo;
......
......@@ -174,6 +174,8 @@ public class CostDetailPageVO {
@ApiModelProperty(value = "更新人")
private String updater;
@ApiModelProperty(value = "更新人")
private String updaterName;
@ApiModelProperty(value = "创建时间")
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private Date createTime;
......
package cn.iocoder.yudao.module.wealth.vo.receivable;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
import java.util.Objects;
@Data
@ApiModel("分页结果")
public class ReceivableBoxReportPageVO implements Serializable {
@ApiModelProperty(value = "自编号id")
private Long id;
@ApiModelProperty(value = "自编号")
private String selfNo;
@ApiModelProperty(value = "目的国id")
private Long destCountryId;
@ApiModelProperty(value = "订单数量")
private Integer orderCount;
@ApiModelProperty(value = "提单数量")
private Integer ladingCount;
@ApiModelProperty(value = "字典settlement_status,191-未结算,192-结算中,193-已结算")
private Integer slStatus;
@ApiModelProperty(value = "结算时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date slSettledTime;
@ApiModelProperty(value = "核销比例")
private String writeOffPercent;
@ApiModelProperty(value = "提单制作,未完成/部分完成/已完成")
private Integer ladingBillStatus;
@ApiModelProperty(value = "到港时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dgDate;
@ApiModelProperty(value = "清关时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date qgDate;
@ApiModelProperty(value = "卸柜/到仓时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date ulWarehouseTime;
@ApiModelProperty(value = "应收款-汇总")
private String receivableTotalSummary;
@ApiModelProperty(value = "应收款-结算")
private String receivableTotalSettle;
@ApiModelProperty(value = "应收款明细-运费")
private String receivableDetailFreight;
@ApiModelProperty(value = "应收款明细-清关费")
private String receivableDetailClearance;
@ApiModelProperty(value = "应收款明细-额外费用")
private String receivableDetailOtherFee;
@ApiModelProperty(value = "目的国实收-运费")
private String receivableDestCountryFreight;
@ApiModelProperty(value = "目的国实收-清关费")
private String receivableDestCountryClearance;
@ApiModelProperty(value = "目的国实收-额外费用")
private String receivableDestCountryOtherFee;
@ApiModelProperty(value = "目的国实收-额外费用(副币种)")
private String receivableDestCountryOtherFeeSub;
@ApiModelProperty(value = "始发国实收-运费")
private String receivableStartCountryFreight;
@ApiModelProperty(value = "始发国实收-清关费")
private String receivableStartCountryClearance;
@ApiModelProperty(value = "始发国实收-额外费用")
private String receivableStartCountryOtherFee;
@ApiModelProperty(value = "始发国实收-额外费用(副币种)")
private String receivableStartCountryOtherFeeSub;
@ApiModelProperty(value = "折扣-运费")
private String receivableDiscountFreight;
@ApiModelProperty(value = "折扣-清关费")
private String receivableDiscountClearance;
@ApiModelProperty(value = "折扣-额外费用")
private String receivableDiscountOtherFee;
@ApiModelProperty(value = "未收款明细-运费")
private String receivableUnsettledFreight;
@ApiModelProperty(value = "未收款明细-清关费")
private String receivableUnsettledClearance;
@ApiModelProperty(value = "未收款明细-额外费用")
private String receivableUnsettledOtherFee;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ReceivableBoxReportPageVO that = (ReceivableBoxReportPageVO) o;
return Objects.equals(id, that.id);
}
@Override
public int hashCode() {
return Objects.hashCode(id);
}
}
package cn.iocoder.yudao.module.wealth.vo.receivable;
import cn.hutool.core.collection.CollectionUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Data
public class ReceivableBoxReportQueryVO {
@ApiModelProperty(value = "自编号")
private String selfNo;
@ApiModelProperty(value = "始发地id列表")
private List<Long> startWarehouseIdList;
@ApiModelProperty(value = "目的国家ID")
private List<Long> destCountryId;
@ApiModelProperty(value = "目的城市ID")
private List<Long> destCity;
@ApiModelProperty(value = "目的仓库id列表")
private List<Long> destWarehouseIdList;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始结算时间")
private Date beginJsDate;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束结算时间")
private Date endJsDate;
@ApiModelProperty(value = "191-未结算,192-结算中,193-已结算")
private Integer slStatus;
@ApiModelProperty(value = "出货状态")
private List<Integer> boxStatus;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始到港时间")
private Date beginDaogangTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束到港时间")
private Date endDaogangTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始清关时间")
private Date beginQingguanTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束清关时间")
private Date endQingguanTime;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "开始卸柜/到仓时间")
private Date beginUlWarehouseTime ;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@ApiModelProperty(value = "结束卸柜/到仓时间")
private Date endUlWarehouseTime ;
@ApiModelProperty(value = "提单制作,0-未完成,1-部分完成,2-已完成")
private Integer ladingBillStatus;
@ApiModelProperty(value = "结算时间排序(默认倒序)")
private Boolean jsTimeDesc = true;
@ApiModelProperty(value = "卸柜/到仓时间排序(默认倒序)")
private Boolean ulWarehouseTimeDesc = true;
@ApiModelProperty(value = "清关时间排序(默认倒序)")
private Boolean qingguanTimeDesc = true;
@ApiModelProperty(value = "到港时间排序(默认倒序)")
private Boolean daogangTimeDesc = true;
private Boolean forceUpdateCache = false;
private List<String> selfNoList;
public Boolean isEmpty() {
return StringUtils.isBlank(selfNo)
&& (CollectionUtil.isEmpty(startWarehouseIdList))
&& (CollectionUtil.isEmpty(destCountryId))
&& (CollectionUtil.isEmpty(destCity))
&& (CollectionUtil.isEmpty(destWarehouseIdList))
&& (beginJsDate == null)
&& (endJsDate == null)
&& (slStatus == null)
&& (boxStatus == null)
&& (beginDaogangTime == null)
&& (endDaogangTime == null)
&& (beginQingguanTime == null)
&& (endQingguanTime == null)
&& (beginUlWarehouseTime == null)
&& (endUlWarehouseTime == null)
&& (ladingBillStatus == null);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ReceivableBoxReportQueryVO that = (ReceivableBoxReportQueryVO) o;
return Objects.equals(selfNo, that.selfNo) &&
// 比较两个list中的元素相同
CollectionUtil.isEqualList(startWarehouseIdList, that.startWarehouseIdList) &&
CollectionUtil.isEqualList(destCountryId, that.destCountryId) &&
CollectionUtil.isEqualList(destCity, that.destCity) &&
CollectionUtil.isEqualList(destWarehouseIdList, that.destWarehouseIdList) &&
Objects.equals(beginJsDate, that.beginJsDate) && Objects.equals(endJsDate, that.endJsDate) && Objects.equals(slStatus, that.slStatus) && Objects.equals(boxStatus, that.boxStatus) && Objects.equals(beginDaogangTime, that.beginDaogangTime) && Objects.equals(endDaogangTime, that.endDaogangTime) && Objects.equals(beginQingguanTime, that.beginQingguanTime) && Objects.equals(endQingguanTime, that.endQingguanTime) && Objects.equals(beginUlWarehouseTime, that.beginUlWarehouseTime) && Objects.equals(endUlWarehouseTime, that.endUlWarehouseTime) && Objects.equals(ladingBillStatus, that.ladingBillStatus) && Objects.equals(jsTimeDesc, that.jsTimeDesc) && Objects.equals(ulWarehouseTimeDesc, that.ulWarehouseTimeDesc) && Objects.equals(qingguanTimeDesc, that.qingguanTimeDesc) && Objects.equals(daogangTimeDesc, that.daogangTimeDesc);
}
@Override
public int hashCode() {
return Objects.hash(selfNo, startWarehouseIdList, destCountryId, destCity, destWarehouseIdList, beginJsDate, endJsDate, slStatus, boxStatus, beginDaogangTime, endDaogangTime, beginQingguanTime, endQingguanTime, beginUlWarehouseTime, endUlWarehouseTime, ladingBillStatus, jsTimeDesc, ulWarehouseTimeDesc, qingguanTimeDesc, daogangTimeDesc);
}
}
package cn.iocoder.yudao.module.wealth.vo.receivable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Data
@ApiModel("应收报表分页结果")
@Builder
@NoArgsConstructor
@AllArgsConstructor
public final class ReceivableBoxReportVO implements Serializable {
@ApiModelProperty(value = "数据", required = true)
private List<ReceivableBoxReportPageVO> list;
@ApiModelProperty(value = "当页汇总", required = true)
private Amount pageAmount;
@ApiModelProperty(value = "查询条件汇总", required = true)
private Amount queryAmount;
@ApiModelProperty(value = "总量", required = true, example = "0")
private Long total = 0L;
@ApiModelProperty(value = "每页记录数", required = true, example = "10")
private Long rows = 10L;
@ApiModelProperty(value = "当前页数", required = true, example = "1")
private Long page = 1L;
@ApiModelProperty(value = "总页数", required = true, example = "0")
private Long pages = 0L;
@Data
public static class Amount {
@ApiModelProperty(value = "应收款-汇总")
private List<ReceivableCurrencyAmount> receivableTotalSummary = new ArrayList<>();
@ApiModelProperty(value = "应收款-结算")
private List<ReceivableCurrencyAmount> receivableTotalSettle = new ArrayList<>();
@ApiModelProperty(value = "应收款明细-运费")
private List<ReceivableCurrencyAmount> receivableDetailFreight = new ArrayList<>();
@ApiModelProperty(value = "应收款明细-清关费")
private List<ReceivableCurrencyAmount> receivableDetailClearance = new ArrayList<>();
@ApiModelProperty(value = "应收款明细-额外费用")
private List<ReceivableCurrencyAmount> receivableDetailOtherFee = new ArrayList<>();
@ApiModelProperty(value = "目的国实收-运费")
private List<ReceivableCurrencyAmount> receivableDestCountryFreight = new ArrayList<>();
@ApiModelProperty(value = "目的国实收-清关费")
private List<ReceivableCurrencyAmount> receivableDestCountryClearance = new ArrayList<>();
@ApiModelProperty(value = "目的国实收-额外费用")
private List<ReceivableCurrencyAmount> receivableDestCountryOtherFee = new ArrayList<>();
@ApiModelProperty(value = "目的国实收-额外费用(副币种)")
private List<ReceivableCurrencyAmount> receivableDestCountryOtherFeeSub = new ArrayList<>();
@ApiModelProperty(value = "始发国实收-运费")
private List<ReceivableCurrencyAmount> receivableStartCountryFreight = new ArrayList<>();
@ApiModelProperty(value = "始发国实收-清关费")
private List<ReceivableCurrencyAmount> receivableStartCountryClearance = new ArrayList<>();
@ApiModelProperty(value = "始发国实收-额外费用")
private List<ReceivableCurrencyAmount> receivableStartCountryOtherFee = new ArrayList<>();
@ApiModelProperty(value = "始发国实收-额外费用(副币种)")
private List<ReceivableCurrencyAmount> receivableStartCountryOtherFeeSub = new ArrayList<>();
@ApiModelProperty(value = "折扣-运费")
private List<ReceivableCurrencyAmount> receivableDiscountFreight = new ArrayList<>();
@ApiModelProperty(value = "折扣-清关费")
private List<ReceivableCurrencyAmount> receivableDiscountClearance = new ArrayList<>();
@ApiModelProperty(value = "折扣-额外费用")
private List<ReceivableCurrencyAmount> receivableDiscountOtherFee = new ArrayList<>();
@ApiModelProperty(value = "未收款明细-运费")
private List<ReceivableCurrencyAmount> receivableUnsettledFreight = new ArrayList<>();
@ApiModelProperty(value = "未收款明细-清关费")
private List<ReceivableCurrencyAmount> receivableUnsettledClearance = new ArrayList<>();
@ApiModelProperty(value = "未收款明细-额外费用")
private List<ReceivableCurrencyAmount> receivableUnsettledOtherFee = new ArrayList<>();
}
}
package cn.iocoder.yudao.module.wealth.vo.receivable;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Objects;
@Data
public class ReceivableCurrencyAmount {
@ApiModelProperty(value = "币种id")
private Long currencyId;
@ApiModelProperty(value = "金额")
private BigDecimal amount;
public ReceivableCurrencyAmount(Long currencyId, BigDecimal amount) {
this.currencyId = currencyId;
this.amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ReceivableCurrencyAmount that = (ReceivableCurrencyAmount) o;
return Objects.equals(currencyId, that.currencyId);
}
@Override
public int hashCode() {
return Objects.hashCode(currencyId);
}
public void addAmount(BigDecimal amount) {
this.amount = this.amount.add(amount).setScale(2, BigDecimal.ROUND_HALF_UP);
}
@Override
public ReceivableCurrencyAmount clone() {
return new ReceivableCurrencyAmount(this.currencyId, this.amount);
}
}
\ No newline at end of file
package cn.iocoder.yudao.module.wealth.vo.receivable;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ReceivableIncomeBelong {
private Long receivableId;
/**
* 收款归属 0 目的国,1 始发国
*/
private Integer incomeBelong;
private BigDecimal writeOffAmount;
private BigDecimal writeOffBaseAmount;
}
......@@ -8,6 +8,7 @@ import org.springframework.format.annotation.DateTimeFormat;
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;
......@@ -51,6 +52,9 @@ public class ReceivableQueryVO {
@ApiModelProperty(value = "费用类型(字典 receivable_fee_type)")
private Integer feeType;
@ApiModelProperty(value = "费用类型(字典 receivable_fee_type)")
private List<Integer> feeTypeList;
@ApiModelProperty(value = "汇率")
private BigDecimal exchangeRate;
......@@ -95,24 +99,39 @@ public class ReceivableQueryVO {
@ApiModelProperty(value = "运输方式id")
private Integer transportId;
@ApiModelProperty(value = "运输方式id")
private List<Integer> transportIdList;
@ApiModelProperty(value = "是否控货")
private Boolean isCargoControl;
@ApiModelProperty(value = "报关类别:我司全代:1,自单代报:2,混合报关:3")
private Integer customsType;
@ApiModelProperty(value = "报关类别:我司全代:1,自单代报:2,混合报关:3")
private List<Integer> customsTypeList;
@ApiModelProperty(value = "始发地id")
private Long departureId;
@ApiModelProperty(value = "始发地id")
private List<Long> departureIdList;
@ApiModelProperty(value = "目的地id")
private Long objectiveId;
@ApiModelProperty(value = "目的地id")
private List<Long> objectiveIdList;
@ApiModelProperty(value = "唛头")
private String marks;
@ApiModelProperty(value = "订单状态详情见字典:order_status")
private Integer status;
@ApiModelProperty(value = "订单状态详情见字典:order_status")
private List<Integer> statusList;
@ApiModelProperty(value = "订单异常状态(字典 order_abnormal_state)")
private Integer abnormalState;
......
package cn.iocoder.yudao.module.wealth.vo.receivable;
import lombok.Data;
@Data
public class ReceivebleBoxRelationOrder {
private Long orderId;
private Long shipmentId;
private Long destCountryId;
}
......@@ -72,10 +72,10 @@ public class CommissionPayableController {
return success(list);
}
@GetMapping("/page")
@PostMapping("/page")
@ApiOperation("获得订单佣金应付款分页")
// @PreAuthorize("@ss.hasPermission('ecw:commission-payable:query')")
public CommonResult<PageResult<CommissionPayableBackVO>> getCommissionPayablePage(@Valid CommissionPayableQueryVO query, PageVO page) {
public CommonResult<PageResult<CommissionPayableBackVO>> getCommissionPayablePage(@RequestBody @Valid CommissionPayableQueryVO query, PageVO page) {
PageResult<CommissionPayableBackVO> pageResult = commissionPayableService.getCommissionPayablePage(query, page);
return success(pageResult);
}
......
package cn.iocoder.yudao.module.wealth.controller.admin.commissionPayment;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.idempotent.core.annotation.Idempotent;
import cn.iocoder.yudao.framework.mybatis.core.vo.PageVO;
import cn.iocoder.yudao.module.wealth.convert.paymentApproval.PaymentApprovalConvert;
import cn.iocoder.yudao.module.wealth.dal.dataobject.paymentApproval.PaymentApprovalDO;
import cn.iocoder.yudao.module.wealth.service.commissionPayment.CommissionPaymentService;
import cn.iocoder.yudao.module.wealth.service.paymentApproval.PaymentApprovalService;
import cn.iocoder.yudao.module.wealth.vo.commissionPayment.CommissionPaymentBackVO;
import cn.iocoder.yudao.module.wealth.vo.commissionPayment.CommissionPaymentCreateReqVO;
import cn.iocoder.yudao.module.wealth.vo.commissionPayment.CommissionPaymentQueryVO;
import cn.iocoder.yudao.module.wealth.vo.commissionPayment.CommissionPaymentUpdateReqVO;
import cn.iocoder.yudao.module.wealth.vo.payment.FinancePaymentCancelVo;
import cn.iocoder.yudao.module.wealth.vo.payment.FinancePaymentVo;
import cn.iocoder.yudao.module.wealth.vo.paymentApproval.PaymentApprovalBackVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.annotations.*;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
import cn.iocoder.yudao.module.wealth.vo.commissionPayment.*;
import cn.iocoder.yudao.module.wealth.dal.dataobject.commissionPayment.CommissionPaymentDO;
import cn.iocoder.yudao.module.wealth.convert.commissionPayment.CommissionPaymentConvert;
import cn.iocoder.yudao.module.wealth.service.commissionPayment.CommissionPaymentService;
@Validated
@RestController
......@@ -82,10 +80,10 @@ public class CommissionPaymentController {
return success(list);
}
@GetMapping("/page")
@PostMapping("/page")
@ApiOperation("获得佣金付款单分页")
// @PreAuthorize("@ss.hasPermission('ecw:commission-payment:query')")
public CommonResult<PageResult<CommissionPaymentBackVO>> getCommissionPaymentPage(@Valid CommissionPaymentQueryVO query, PageVO page) {
public CommonResult<PageResult<CommissionPaymentBackVO>> getCommissionPaymentPage(@RequestBody @Valid CommissionPaymentQueryVO query, PageVO page) {
PageResult<CommissionPaymentBackVO> pageResult = commissionPaymentService.getCommissionPaymentPage(query, page);
return success(pageResult);
}
......
package cn.iocoder.yudao.module.wealth.controller.admin.job;
import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.module.wealth.dal.mysql.receivable.ReceivableMapper;
import cn.iocoder.yudao.module.wealth.service.receivable.ReceivableService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Slf4j
@AllArgsConstructor
public class BoxReportCacheRefreshJob implements JobHandler {
private final ReceivableService receivableService;
private final ReceivableMapper receivableMapper;
@Override
public String execute(String param) {
log.info("初始化应收报表缓存");
try {
List<Long> boxIds = receivableMapper.getAllBoxId();
receivableService.updateBoxAmountCache(boxIds, true);
} catch (Exception e) {
log.error("初始化应收报表缓存失败", e);
}
log.info("初始化应收报表缓存完成");
return "";
}
}
package cn.iocoder.yudao.module.wealth.controller.admin.job;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.redis.helper.RedisHelper;
import cn.iocoder.yudao.module.wealth.dal.mysql.receivable.ReceivableMapper;
import cn.iocoder.yudao.module.wealth.service.receivable.ReceivableService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.module.wealth.enums.BoxReportConstant.BOX_AMOUNT_CACHE;
@Component
@Slf4j
@AllArgsConstructor
public class BoxReportCacheRefreshRunner implements ApplicationRunner {
private final ReceivableService receivableService;
private final ReceivableMapper receivableMapper;
private final RedisHelper redisHelper;
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("初始化应收报表缓存");
try {
List<Long> boxIds = receivableMapper.getAllBoxId();
Set<String> keys = redisHelper.keys(BOX_AMOUNT_CACHE + "*");
if (CollectionUtil.isNotEmpty(keys)) {
List<Long> cacheBoxIds = keys.stream().map(key -> Long.parseLong(key.replace(BOX_AMOUNT_CACHE, ""))).collect(Collectors.toList());
boxIds = boxIds.stream().filter(boxId -> !cacheBoxIds.contains(boxId)).collect(Collectors.toList());
}
receivableService.updateBoxAmountCache(boxIds, false);
} catch (Exception e) {
log.error("初始化应收报表缓存失败", e);
}
log.info("初始化应收报表缓存完成");
}
}
......@@ -75,10 +75,10 @@ public class PayableController {
return success(PayableConvert.INSTANCE.convertList(list));
}
@GetMapping("/page")
@PostMapping("/page")
@ApiOperation("应付款分页列表,添加供应商未付款项列表 两个用这一个查询")
//@PreAuthorize("@ss.hasPermission('ecw:payable:query')")
public CommonResult<PageResult<PayableOrderBackVo>> getPayablePage(@Valid PayableQueryVO query, PageVO page) {
public CommonResult<PageResult<PayableOrderBackVo>> getPayablePage(@RequestBody @Valid PayableQueryVO query, PageVO page) {
PageResult<PayableOrderBackVo> result = payableService.getPayablePage(query, page);
return success(result);
}
......
......@@ -124,10 +124,10 @@ public class PaymentController {
}
@GetMapping("/page")
@PostMapping("/page")
@ApiOperation("获得付款单分页")
//@PreAuthorize("@ss.hasPermission('ecw:payment:query')")
public CommonResult<PageResult<PaymentBackVO>> getPaymentPage(@Valid PaymentQueryVO query, PageVO page) {
public CommonResult<PageResult<PaymentBackVO>> getPaymentPage(@RequestBody @Valid PaymentQueryVO query, PageVO page) {
PageResult<PaymentDO> pageResult = paymentService.getPaymentPage(query, page);
return success(PaymentConvert.INSTANCE.convertPage(pageResult));
}
......
......@@ -311,6 +311,7 @@ public class ReceiptController {
@PostMapping("/batch-gen-receipt")
@ApiOperation("批量生成收款单")
@Idempotent(timeout = 5)
public CommonResult<List<ReceiptBatchGenRespVO>> batchGenReceipt(@RequestBody List<ReceiptBatchCreateReqVO> createReqVOList) {
return success(receiptService.batchGenReceipt(createReqVOList));
}
......
......@@ -70,14 +70,11 @@ public class ReceiptItemController {
@Resource
private ReceiptApprovalMapper receiptApprovalMapper;
@Resource
private BankApi bankApi;
@PostMapping("/create")
@ApiOperation("创建收款明细")
//@PreAuthorize("@ss.hasPermission('ecw:receipt-item:create')")
public CommonResult<Long> createReceiptItem(@Valid @RequestBody ReceiptItemCreateReqVO createReqVO) {
return success(receiptItemService.createReceiptItem(createReqVO));
return success(receiptItemService.createReceiptItem(createReqVO,false));
}
@PutMapping("/update")
......@@ -102,8 +99,6 @@ public class ReceiptItemController {
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
public CommonResult<ReceiptItemBackVO> getReceiptItemDetail(@RequestParam("id") Long id) {
ReceiptItemBackVO receiptItemVO = receiptItemService.getReceiptItemDetail(id);
BankAccountDTO account = bankApi.getBankAccountByAccountNo(receiptItemVO.getAccountNo());
receiptItemVO.setAccountId(account.getId());
getSY(receiptItemVO, receiptItemVO.getReceiptId());
SetData(receiptItemVO);
return success(receiptItemVO);
......@@ -183,7 +178,8 @@ public class ReceiptItemController {
LambdaQueryWrapper<ReceiptItemDO> lambdaQueryWrapper =
new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ReceiptItemDO::getReceiptId, id);
lambdaQueryWrapper.eq(ReceiptItemDO::getReceiptId, id)
.in(ReceiptItemDO::getStatus, Arrays.asList(1, 2 ,3));
List<ReceiptItemDO> listItem =
receiptItemMapper.selectList(lambdaQueryWrapper);
......@@ -214,12 +210,7 @@ public class ReceiptItemController {
LambdaQueryWrapper<ReceiptItemDO> lambdaQueryWrapper = new LambdaQueryWrapper();
lambdaQueryWrapper.eq(ReceiptItemDO::getReceiptId, id);
List<ReceiptItemDO> list = receiptItemService.list(lambdaQueryWrapper);
List<ReceiptItemBackVO> receiptItemBackVOS = ReceiptItemConvert.INSTANCE.convertList(list);
receiptItemBackVOS.forEach(vo -> {
BankAccountDTO account = bankApi.getBankAccountByAccountNo(vo.getAccountNo());
vo.setAccountId(account.getId());
});
return success(receiptItemBackVOS);
return success(ReceiptItemConvert.INSTANCE.convertList(list));
}
@PostMapping("/review/page")
......@@ -315,6 +306,7 @@ public class ReceiptItemController {
@PostMapping(value = "/import", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ApiOperation("批量银行收款信息导入")
@Idempotent(timeout = 5)
public CommonResult<List<ReceiptItemBatchRespVO>> receiptAccountImport(@RequestPart("file") MultipartFile file, @RequestParam(value = "ignoreItem") Boolean ignoreItem) throws IOException {
List<ReceiptItemBatchCreateReqVO> list = ExcelUtils.read(file, ReceiptItemBatchCreateReqVO.class);
return success(receiptItemService.receiptItemImport(list, ignoreItem));
......
......@@ -250,7 +250,7 @@ justauth:
prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
ue:
root-path: classpath:/static #文件存储根目录(可选配置),默认为[classpath:/static]
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
......@@ -130,6 +130,7 @@ order.warehouse.check.not.exists=order warehouse check not exists
order.warehouse.check.bad.volume=order warehouse check bad volume
order.warehouse.check.bad.weight=order warehouse check bad weight
warehouse.adjust.not.exists=warehouse adjust not exists
warehouse.adjust.have.arrived=Position transfer records have arrived in the warehouse
shipment.not.exists=Shipment does not exist
shipment.order.exit.not.exists=Order exit information does not exist
line.not.open=line not open
......@@ -661,6 +662,7 @@ prod.brand.not.null=brand is not null or zero
preload.not.exist=Goods are not pre-loaded in the shipment order
warehouse.in.property.not.null.and.zero=goods [{}] {} cannot be empty and zero.
warehouse.in.box.exception=The order has already been scheduled and warehouse data cannot be manipulated
order.update.box.exception=The order has been scheduled
split.order.can.not.change.carton.num=Unmodifiable box count for split order
split.order.can.not.change.order.label=Split order cannot change label box number
split.order.can.not.warehouse.in=Split orders cannot add products or add new inventory records
......
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