fix: 合同结算单打印预览单价计算、费用赔偿计算相关,出入库内容字段报错

Reviewed-on: daoyoucloud/tachycode#663
Co-authored-by: wjh <wwwjh0710@163.com>
Co-committed-by: wjh <wwwjh0710@163.com>
This commit is contained in:
wjh 2024-04-09 22:14:28 +08:00 committed by wangjiahui
parent a329ab5727
commit d9e851d1ca
4 changed files with 208 additions and 222 deletions

View File

@ -44,21 +44,23 @@ export const RecordDetails: CustomFunctionComponent = () => {
// 根据关联产品名称来合并赔偿 // 根据关联产品名称来合并赔偿
if (reqRecordItemFeeItems.data) { if (reqRecordItemFeeItems.data) {
feeItems = reqRecordItemFeeItems.data.data?.reduce((prev, current) => { feeItems = reqRecordItemFeeItems.data.data?.reduce((prev, current) => {
const key = current.record_item.product.name; if (current.record_item.product) {
if (!(key in prev)) { const key = current.record_item.product.name;
prev[key] = {}; if (!(key in prev)) {
prev[key] = {};
}
if (!current.product) {
return prev;
}
if (!(current.product.label in prev[key])) {
prev[key][current.product.label] = {
id: current.product.id,
label: current.product.label,
count: 0,
};
}
prev[key][current.product.label].count += current.count;
} }
if (!current.product) {
return prev;
}
if (!(current.product.label in prev[key])) {
prev[key][current.product.label] = {
id: current.product.id,
label: current.product.label,
count: 0,
};
}
prev[key][current.product.label].count += current.count;
return prev; return prev;
}, {}); }, {});
} }
@ -66,6 +68,7 @@ export const RecordDetails: CustomFunctionComponent = () => {
if (reqRecordItems.data && feeItems) { if (reqRecordItems.data && feeItems) {
reqRecordItems.data.data?.forEach((item) => { reqRecordItems.data.data?.forEach((item) => {
if (!item.product) return;
const key = item.product.name; const key = item.product.name;
const count = item.product.category.convertible ? item.count * item.product.ratio : item.count; const count = item.product.category.convertible ? item.count * item.product.ratio : item.count;
const unit = item.product.category.convertible const unit = item.product.category.convertible

View File

@ -41,11 +41,17 @@ export class SettlementService {
const lease_rules = ruleItem?.rule.lease_items; const lease_rules = ruleItem?.rule.lease_items;
// fee_rules 费用明细 // fee_rules 费用明细
const fee_rules = ruleItem?.rule.fee_item; const fee_rules = ruleItem?.rule.fee_item;
//合并产品
const countRule = [];
// 处理原始数据,适合后续租金数据成 // 处理原始数据,适合后续租金数据成
if (settlementAbout.records === null) { if (settlementAbout.records === null) {
settlementAbout.records = []; settlementAbout.records = [];
} }
lease_rules.forEach((rule) => {
if (rule?.products.length > 1) {
countRule.push(...rule.products.map((value) => value));
}
});
// 正常租赁数据 // 正常租赁数据
lease_rules?.forEach((rule) => { lease_rules?.forEach((rule) => {
if (rule) { if (rule) {
@ -63,15 +69,17 @@ export class SettlementService {
if (recordItem) { if (recordItem) {
let isCount; let isCount;
if (productLength > 1) { if (productLength > 1) {
isCount = rule.products.find( isCount = rule.products.find((productRule) => {
(productRule) => return (
productRule.product_id > RulesNumber && productRule.product_id > RulesNumber &&
productRule.product_id - RulesNumber === recordItem.product_category_id, productRule.product_id - RulesNumber === recordItem.product_category_id
); );
});
} else { } else {
isCount = isCount =
rule.products[0].product_id > RulesNumber && rule.products[0].product_id > RulesNumber &&
rule.products[0].product_id - RulesNumber === recordItem.product_category_id; rule.products[0].product_id - RulesNumber === recordItem.product_category_id &&
!countRule.find((productRule) => productRule.product_id === rule.products[0].product_id);
} }
if (isCount) { if (isCount) {
const productName = item.record_items.filter( const productName = item.record_items.filter(
@ -99,7 +107,7 @@ export class SettlementService {
is_excluded: false, is_excluded: false,
count: recordItem.weight * Number(movement), count: recordItem.weight * Number(movement),
unit_price: rule.unit_price * 1000, unit_price: rule.unit_price * 1000,
amount: recordItem.weight * (rule.unit_price * 1000) * day, amount: recordItem.weight * (rule.unit_price * 1000) * day * Number(movement),
unit_name: '吨', unit_name: '吨',
productCategory, productCategory,
}); });
@ -118,9 +126,10 @@ export class SettlementService {
); );
} else { } else {
isCount = isCount =
(rule.products[0].product_id > RulesNumber && ((rule.products[0].product_id > RulesNumber &&
rule.products[0].product_id - RulesNumber === itemValue?.product.category_id) || rule.products[0].product_id - RulesNumber === itemValue?.product.category_id) ||
rule.products[0].product_id === itemValue?.product.id; rule.products[0].product_id === itemValue?.product.id) &&
!countRule.find((productRule) => productRule.product_id === rule.products[0].product_id);
} }
return isCount; return isCount;
}); });
@ -147,7 +156,7 @@ export class SettlementService {
is_excluded: false, is_excluded: false,
count: item.weight * Number(movement), count: item.weight * Number(movement),
unit_price: rule.unit_price * 1000, unit_price: rule.unit_price * 1000,
amount: item.weight * (rule.unit_price * 1000) * day, amount: item.weight * (rule.unit_price * 1000) * day * Number(movement),
unit_name: '吨', unit_name: '吨',
productCategory, productCategory,
}); });
@ -207,173 +216,158 @@ export class SettlementService {
if (rulefee.fee_product_id) { if (rulefee.fee_product_id) {
const spec = rulefee.product.spec; const spec = rulefee.product.spec;
const name = rulefee.product.name; const name = rulefee.product.name;
if (rulefee.conversion_logic_id === ConversionLogics.ActualWeight) { rule.products.forEach((productRule) => {
let data; if (rulefee.conversion_logic_id === ConversionLogics.ActualWeight) {
if ( let data;
rulefee.count_source === countCource.outProduct || if (
rulefee.count_source === countCource.outItem rulefee.count_source === countCource.outProduct ||
) { rulefee.count_source === countCource.outItem
if (item.movement === '-1') { ) {
data = recordWeight(rule, item, settlementsId, rule.products, rulefee); if (item.movement === '-1') {
data = recordWeight(rule, item, settlementsId, productRule, rulefee);
if (data) {
data.movement = '-1';
}
}
} else if (
rulefee.count_source === countCource.enterProduct ||
rulefee.count_source === countCource.enterItem
) {
if (item.movement === '1') {
data = recordWeight(rule, item, settlementsId, productRule, rulefee);
if (data) {
data.movement = '1';
}
}
} else {
data = recordWeight(rule, item, settlementsId, productRule, rulefee);
if (data) { if (data) {
data.movement = '-1'; data.movement = '0';
} }
} }
} else if ( if (data) {
rulefee.count_source === countCource.enterProduct || createFeesDatas.push({ ...data, productCategory });
rulefee.count_source === countCource.enterItem
) {
if (item.movement === '1') {
data = recordWeight(rule, item, settlementsId, rule.products, rulefee);
if (data) {
data.movement = '1';
}
} }
} else { } else {
data = recordWeight(rule, item, settlementsId, rule.products, rulefee); item.record_items?.forEach((recordItem) => {
if (data) { if (recordItem) {
data.movement = '0'; if (
} productRule.product_id - RulesNumber === recordItem.product.category_id ||
} recordItem.product_id === productRule.product_id
if (data) { ) {
createFeesDatas.push({ ...data, productCategory }); let productname;
} switch (productCategory) {
} else { case 'category':
item.record_items?.forEach((recordItem) => { productname = recordItem.product.name;
if (recordItem) { break;
let productRule; case 'product':
if (productLength > 1) { productname = recordItem.product.label;
productRule = rule.products.find( break;
(item) => }
item.product_id - RulesNumber === recordItem.product.category_id || //人工录入
recordItem.product_id === item.product_id, if (rulefee.count_source === countCource.artificial) {
); if (rulefee.conversion_logic_id !== ConversionLogics.ActualWeight) {
} else { if (recordItem.record_item_fee_items.length) {
productRule = recordItem.record_item_fee_items.forEach((value) => {
rule.products[0].product_id - RulesNumber === recordItem.product.category_id || if (value.product_id === rulefee.fee_product_id) {
recordItem.product_id === rule.products[0].product_id const { count, unit } = ruleCount(
? rule.products[0] rule,
: null; item,
} recordItem,
if (productRule) { value.count,
let productname; rulefee,
switch (productCategory) { );
case 'category': createFeesDatas.push({
productname = recordItem.product.name; settlement_id: settlementsId,
break; date: item.date,
case 'product': name: productname + '-' + spec,
productname = recordItem.product.label; label: recordItem.product.label + '-' + spec,
break; category: name,
} movement: item.movement,
const ruleName = count: count,
productLength > 1 ? rule.comment ?? '' + '-' + spec : productname + '-' + spec; unit_price: rulefee.unit_price,
const ruleLabel = amount: rulefee.unit_price * count,
productLength > 1 unit_name: unit,
? rule.comment ?? '' + '-' + spec is_excluded: value.is_excluded,
: recordItem.product.label + '-' + spec; productCategory,
//人工录入 });
if (rulefee.count_source === countCource.artificial) { }
if (rulefee.conversion_logic_id !== ConversionLogics.ActualWeight) { });
if (recordItem.record_item_fee_items.length) { }
recordItem.record_item_fee_items.forEach((value) => { }
if (value.product_id === rulefee.fee_product_id) { } //出库
const { count, unit } = ruleCount( else if (
rule, rulefee.count_source === countCource.outProduct ||
item, rulefee.count_source === countCource.outItem
recordItem, ) {
value.count, if (item.movement === '-1') {
rulefee, const { count, unit } = ruleCount(rule, item, recordItem, '', rulefee);
); const recordCount = recordItemsFee(rule, item, recordItem, count, rulefee);
createFeesDatas.push({ createFeesDatas.push({
settlement_id: settlementsId, settlement_id: settlementsId,
date: item.date, date: item.date,
name: ruleName, name: productname + '-' + spec,
label: ruleLabel, label: recordItem.product.label + '-' + spec,
category: name, category: name,
movement: item.movement, movement: '-1',
count: count, count: recordCount,
unit_price: rulefee.unit_price, unit_price: rulefee.unit_price,
amount: rulefee.unit_price * count, amount: count * rulefee.unit_price,
unit_name: unit, unit_name: unit,
is_excluded: value.is_excluded, is_excluded: false,
productCategory, productCategory,
});
}
}); });
} }
} } //入库
} //出库 else if (
else if ( rulefee.count_source === countCource.enterProduct ||
rulefee.count_source === countCource.outProduct || rulefee.count_source === countCource.enterItem
rulefee.count_source === countCource.outItem ) {
) { if (item.movement === '1') {
if (item.movement === '-1') { const { count, unit } = ruleCount(rule, item, recordItem, '', rulefee);
const recordCount = recordItemsFee(rule, item, recordItem, count, rulefee);
createFeesDatas.push({
settlement_id: settlementsId,
date: item.date,
name: productname + '-' + spec,
label: recordItem.product.label + '-' + spec,
category: name,
movement: '1',
count: recordCount,
unit_price: rulefee.unit_price,
amount: count * rulefee.unit_price,
unit_name: unit,
is_excluded: false,
productCategory,
});
}
} //出入库
else if (
rulefee.count_source === countCource.product ||
rulefee.count_source === countCource.item
) {
const { count, unit } = ruleCount(rule, item, recordItem, '', rulefee); const { count, unit } = ruleCount(rule, item, recordItem, '', rulefee);
const recordCount = recordItemsFee(rule, item, recordItem, count, rulefee); const recordCount = recordItemsFee(rule, item, recordItem, count, rulefee);
createFeesDatas.push({ createFeesDatas.push({
settlement_id: settlementsId, settlement_id: settlementsId,
date: item.date, date: item.date,
name: ruleName, name: productname + '-' + spec,
label: ruleLabel, label: recordItem.product.label + '-' + spec,
category: name, category: name,
movement: '-1', movement: '0',
count: recordCount, count: recordCount,
unit_price: rulefee.unit_price, unit_price: rule.unit_price,
amount: count * rulefee.unit_price, amount: count * rule.unit_price,
unit_name: unit, unit_name: unit,
is_excluded: false, is_excluded: false,
productCategory, productCategory,
}); });
} }
} //入库
else if (
rulefee.count_source === countCource.enterProduct ||
rulefee.count_source === countCource.enterItem
) {
if (item.movement === '1') {
const { count, unit } = ruleCount(rule, item, recordItem, '', rulefee);
const recordCount = recordItemsFee(rule, item, recordItem, count, rulefee);
createFeesDatas.push({
settlement_id: settlementsId,
date: item.date,
name: ruleName,
label: ruleLabel,
category: name,
movement: '1',
count: recordCount,
unit_price: rulefee.unit_price,
amount: count * rulefee.unit_price,
unit_name: unit,
is_excluded: false,
productCategory,
});
}
} //出入库
else if (
rulefee.count_source === countCource.product ||
rulefee.count_source === countCource.item
) {
const { count, unit } = ruleCount(rule, item, recordItem, '', rulefee);
const recordCount = recordItemsFee(rule, item, recordItem, count, rulefee);
createFeesDatas.push({
settlement_id: settlementsId,
date: item.date,
name: ruleName,
label: ruleLabel,
category: name,
movement: '0',
count: recordCount,
unit_price: rule.unit_price,
amount: count * rule.unit_price,
unit_name: unit,
is_excluded: false,
productCategory,
});
} }
} }
} });
}); }
} });
} }
}); });
} }
@ -827,32 +821,17 @@ export class SettlementService {
* @param item * @param item
* @param settlementsId * @param settlementsId
*/ */
const recordWeight = (rule, item, settlementsId, products, rulefee?) => { const recordWeight = (rule, item, settlementsId, productRule, rulefee?) => {
let productCategory = 'category'; const productCategory = productRule.product_id > RulesNumber ? 'category' : 'product';
const productLength = products.length;
if (productLength === 1) {
productCategory = products[0].product_id > RulesNumber ? 'category' : 'product';
}
const spec = rulefee.product.spec; const spec = rulefee.product.spec;
const name = rulefee.product.name; const name = rulefee.product.name;
if (item.weight_items.length) { if (item.weight_items.length) {
const itemWeight = item.weight_items.find((weightItem) => { const itemWeight = item.weight_items.filter(
let isCount; (weightItem) =>
if (productLength > 1) { (productRule.product_id > RulesNumber &&
isCount = products.find( productRule.product_id - RulesNumber === weightItem.product_category_id) ||
(productRule) => productRule.product_id === weightItem.product_category_id,
(productRule.product_id > RulesNumber && )[0];
productRule.product_id - RulesNumber === weightItem.product_category_id) ||
productRule.product_id === weightItem.product_category_id,
);
} else {
isCount =
(products[0].product_id > RulesNumber &&
products[0].product_id - RulesNumber === weightItem.product_category_id) ||
products[0].product_id === weightItem.product_category_id;
}
return isCount;
});
const productsName = item.record_items?.filter( const productsName = item.record_items?.filter(
(value) => value.product.category_id === itemWeight.product_category_id, (value) => value.product.category_id === itemWeight.product_category_id,
)[0].product; )[0].product;
@ -860,8 +839,8 @@ const recordWeight = (rule, item, settlementsId, products, rulefee?) => {
return { return {
settlement_id: settlementsId, settlement_id: settlementsId,
date: item.date, date: item.date,
name: productLength > 1 ? rule.comment ?? '' + '-' + spec : productName + '-' + spec, name: productName + '-' + spec,
label: productLength > 1 ? rule.comment ?? '' + '-' + spec : productsName.label + '-' + spec, label: productsName.label + '-' + spec,
category: rulefee ? name : rule.product.name, category: rulefee ? name : rule.product.name,
movement: item.movement, movement: item.movement,
count: itemWeight.weight, count: itemWeight.weight,
@ -871,39 +850,28 @@ const recordWeight = (rule, item, settlementsId, products, rulefee?) => {
is_excluded: false, is_excluded: false,
}; };
} else { } else {
const isRecordItem = item.record_items.find((itemValue) => { const isRecordItem = item.record_items.find(
let isCount; (itemValue) =>
if (productLength > 1) { (productRule.product_id > RulesNumber &&
isCount = products.find( productRule.product_id - RulesNumber === itemValue?.product.category_id) ||
(productRule) => productRule.product_id === itemValue?.product.category_id,
(productRule.product_id > RulesNumber && );
productRule.product_id - RulesNumber === itemValue?.product.category_id) ||
productRule.product_id === itemValue?.product.category_id,
);
} else {
isCount =
(products[0].product_id > RulesNumber &&
products[0].product_id - RulesNumber === itemValue?.product.category_id) ||
products[0].product_id === itemValue?.product.category_id;
}
return isCount;
});
if (isRecordItem) { if (isRecordItem) {
let count = item.weight; let count = item.weight;
item.record_items.forEach((recordItem) => { item.record_items.forEach((recordItem) => {
if (recordItem.record_item_fee_items.length) { if (recordItem.record_item_fee_items.length) {
const recordItemFee = recordItem.record_item_fee_items.find( const recordItemFee = recordItem.record_item_fee_items.filter(
(value) => value.product_id === rulefee.fee_product_id, (value) => value.product_id === rulefee.fee_product_id,
); )[0];
count = recordItemFee?.is_excluded ? count - recordItemFee?.count : count; count = recordItemFee?.is_excluded ? count - recordItemFee.count : count;
} }
}); });
const productName = isRecordItem.product.name; const productName = isRecordItem.product.name;
return { return {
settlement_id: settlementsId, settlement_id: settlementsId,
date: item.date, date: item.date,
name: productLength > 1 ? rule.comment ?? '' + '-' + spec : productName + '-' + spec, name: productName + '-' + spec,
label: productLength > 1 ? rule.comment ?? '' + '-' + spec : productName + '-' + spec, label: productName + '-' + spec,
category: name, category: name,
movement: item.movement, movement: item.movement,
count: count, count: count,
@ -923,10 +891,10 @@ const recordWeight = (rule, item, settlementsId, products, rulefee?) => {
* @param itemCount * @param itemCount
* @returns count,unit * @returns count,unit
*/ */
const ruleCount = (rules: FeeRule | LeaseRule, item: Record, recordItem: RecordItems, valueCount?, rulefee?) => { const ruleCount = (lease_rules: FeeRule | LeaseRule, item: Record, recordItem: RecordItems, valueCount?, rulefee?) => {
let count, unit; let count, unit;
const itemCount = valueCount ? valueCount : recordItem.count; const itemCount = valueCount ? valueCount : recordItem.count;
const conversion_logic_id = rulefee ? rulefee.conversion_logic_id : rules.conversion_logic_id; const conversion_logic_id = rulefee ? rulefee.conversion_logic_id : lease_rules.conversion_logic_id;
if (conversion_logic_id === ConversionLogics.Product) { if (conversion_logic_id === ConversionLogics.Product) {
// 换算:2 // 换算:2
// 查产品分类,看产品分类是否需要换算 // 查产品分类,看产品分类是否需要换算
@ -943,7 +911,8 @@ const ruleCount = (rules: FeeRule | LeaseRule, item: Record, recordItem: RecordI
count = itemCount * recordItem.product.weight; count = itemCount * recordItem.product.weight;
unit = recordItem.product.product_category.unit; unit = recordItem.product.product_category.unit;
} else { } else {
const rule = rules?.ucl?.weight_items.filter( const rules = rulefee ? rulefee?.weight_items : lease_rules?.ucl?.weight_items;
const rule = rules.filter(
(value) => (value) =>
value.product_id === recordItem.product_id || value.product_id - RulesNumber === recordItem.product.category_id, value.product_id === recordItem.product_id || value.product_id - RulesNumber === recordItem.product.category_id,
)[0]; )[0];

View File

@ -1,5 +1,7 @@
-- 租金 -- 租金
SELECT -- distinct说明sql根据订单中产品去合同规则中找规则如果合同存在单个产品多条规则会连接查询出多条规则所以需要distinct
-- 直接disinct掉不会有任何影响因为查询数据只关注点单产品数量根换算逻辑正好多条规则换算逻辑是一样的
SELECT DISTINCT
r.category, r.category,
ri.comment AS item_comment, ri.comment AS item_comment,
ri.count, ri.count,

View File

@ -43,7 +43,19 @@ SELECT
SELECT SELECT
COALESCE( COALESCE(
JSONB_AGG( JSONB_AGG(
JSONB_SET(TO_JSONB(cpfi), '{product}', TO_JSONB(product)) JSONB_SET(TO_JSONB(cpfi), '{product}', TO_JSONB(product)) || JSONB_SET(
TO_JSONB(cpfi),
'{weight_items}',
(
SELECT
COALESCE(JSONB_AGG(wrs), '[]'::jsonb)
FROM
weight_rules wrs
WHERE
wrs.logic_id = cpfi.conversion_logic_id
AND cpfi.conversion_logic_id > 4
)
)
), ),
'[]'::jsonb '[]'::jsonb
) )