feat: 仓库二期,出入库单打印预览,产品范围,计价数量,换算数量
Reviewed-on: daoyoucloud/tachycode#503 Co-authored-by: hello@lv <2256334253@qq.com> Co-committed-by: hello@lv <2256334253@qq.com>
This commit is contained in:
		
							parent
							
								
									6251551ded
								
							
						
					
					
						commit
						eb090572c6
					
				@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "@hera/plugin-core",
 | 
					  "name": "@hera/plugin-core",
 | 
				
			||||||
  "version": "1.6.1",
 | 
					  "version": "1.6.2",
 | 
				
			||||||
  "displayName": "Hera platform",
 | 
					  "displayName": "Hera platform",
 | 
				
			||||||
  "displayName.zh-CN": "赫拉平台",
 | 
					  "displayName.zh-CN": "赫拉平台",
 | 
				
			||||||
  "description": "Hera platform as nocobase plugin.",
 | 
					  "description": "Hera platform as nocobase plugin.",
 | 
				
			||||||
@ -35,4 +35,4 @@
 | 
				
			|||||||
  "keywords": [
 | 
					  "keywords": [
 | 
				
			||||||
    "System management"
 | 
					    "System management"
 | 
				
			||||||
  ]
 | 
					  ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -1,6 +1,6 @@
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  "name": "@hera/plugin-rental",
 | 
					  "name": "@hera/plugin-rental",
 | 
				
			||||||
  "version": "1.6.2",
 | 
					  "version": "1.6.3",
 | 
				
			||||||
  "main": "dist/server/index.js",
 | 
					  "main": "dist/server/index.js",
 | 
				
			||||||
  "displayName": "professional construction materials rental system - customized based on hera",
 | 
					  "displayName": "professional construction materials rental system - customized based on hera",
 | 
				
			||||||
  "displayName.zh-CN": "专业建材租赁系统 - 基于赫拉定制",
 | 
					  "displayName.zh-CN": "专业建材租赁系统 - 基于赫拉定制",
 | 
				
			||||||
@ -27,4 +27,4 @@
 | 
				
			|||||||
  "keywords": [
 | 
					  "keywords": [
 | 
				
			||||||
    "System management"
 | 
					    "System management"
 | 
				
			||||||
  ]
 | 
					  ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -7,6 +7,8 @@ import { Spin } from 'antd';
 | 
				
			|||||||
import { useCachedRequest } from '../hooks';
 | 
					import { useCachedRequest } from '../hooks';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const RecordItemCount = observer((props) => {
 | 
					export const RecordItemCount = observer((props) => {
 | 
				
			||||||
 | 
					  const form = useForm();
 | 
				
			||||||
 | 
					  const field = useField();
 | 
				
			||||||
  const param = {
 | 
					  const param = {
 | 
				
			||||||
    resource: 'product_category',
 | 
					    resource: 'product_category',
 | 
				
			||||||
    action: 'list',
 | 
					    action: 'list',
 | 
				
			||||||
@ -15,19 +17,17 @@ export const RecordItemCount = observer((props) => {
 | 
				
			|||||||
    },
 | 
					    },
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
  const { loading, data } = useCachedRequest<any>(param);
 | 
					  const { loading, data } = useCachedRequest<any>(param);
 | 
				
			||||||
  const form = useForm();
 | 
					 | 
				
			||||||
  const field = useField();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!data && loading) {
 | 
					  if (!data && loading) {
 | 
				
			||||||
    return <Spin />;
 | 
					    return <Spin />;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					 | 
				
			||||||
  const item = form.getValuesIn(field.path.slice(0, -2).entire);
 | 
					  const item = form.getValuesIn(field.path.slice(0, -2).entire);
 | 
				
			||||||
  if (item?.product && item?.count && data) {
 | 
					  if (item?.product && item?.count) {
 | 
				
			||||||
    const category = data.data.find((category) => category.id === item.product.category_id);
 | 
					    const category = data.data?.find((category) => category.id === item?.product.category_id);
 | 
				
			||||||
    if (!category) return;
 | 
					    if (!category) return;
 | 
				
			||||||
    const value = category.convertible ? (item.product.ratio || 0) * item.count : item.count;
 | 
					    const value = category.convertible ? (item.product.ratio || 0) * item.count : item.count;
 | 
				
			||||||
    const unit = category.convertible ? category.conversion_unit : category.unit;
 | 
					    const unit = category.convertible ? category.conversion_unit : category.unit || '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return <span>{formatQuantity(value, 2) + unit}</span>;
 | 
					    return <span>{formatQuantity(value, 2) + unit}</span>;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return <span> - </span>;
 | 
					  return <span> - </span>;
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,7 @@ import { observer, useField, useForm } from '@formily/react';
 | 
				
			|||||||
import _ from 'lodash';
 | 
					import _ from 'lodash';
 | 
				
			||||||
import { ConversionLogics, RecordCategory } from '../../utils/constants';
 | 
					import { ConversionLogics, RecordCategory } from '../../utils/constants';
 | 
				
			||||||
import { formatQuantity } from '../../utils/currencyUtils';
 | 
					import { formatQuantity } from '../../utils/currencyUtils';
 | 
				
			||||||
import { useCachedRequest, useLeaseItems } from '../hooks';
 | 
					import { useCachedRequest, useLeaseItems, useProductFeeItems } from '../hooks';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// 计价数量
 | 
					// 计价数量
 | 
				
			||||||
export const RecordItemValuationQuantity = observer((props) => {
 | 
					export const RecordItemValuationQuantity = observer((props) => {
 | 
				
			||||||
@ -33,6 +33,9 @@ export const RecordItemValuationQuantity = observer((props) => {
 | 
				
			|||||||
  const { data: leaseItems } = useLeaseItems(contractPlanId);
 | 
					  const { data: leaseItems } = useLeaseItems(contractPlanId);
 | 
				
			||||||
  const { data: inLeaseItems } = useLeaseItems(inContractPlanId);
 | 
					  const { data: inLeaseItems } = useLeaseItems(inContractPlanId);
 | 
				
			||||||
  const { data: outLeaseItems } = useLeaseItems(outContractPlanId);
 | 
					  const { data: outLeaseItems } = useLeaseItems(outContractPlanId);
 | 
				
			||||||
 | 
					  const { data: ProductFeeItems } = useProductFeeItems(contractPlanId);
 | 
				
			||||||
 | 
					  const { data: inProductFeeItems } = useProductFeeItems(inContractPlanId);
 | 
				
			||||||
 | 
					  const { data: outProductFeeItems } = useProductFeeItems(outContractPlanId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const item = form.getValuesIn(field.path.slice(0, -2).entire);
 | 
					  const item = form.getValuesIn(field.path.slice(0, -2).entire);
 | 
				
			||||||
  if (item?.product && item?.count) {
 | 
					  if (item?.product && item?.count) {
 | 
				
			||||||
@ -50,7 +53,13 @@ export const RecordItemValuationQuantity = observer((props) => {
 | 
				
			|||||||
          (product) => product.id - 99999 === item.product?.category_id || product.id === item.product?.id,
 | 
					          (product) => product.id - 99999 === item.product?.category_id || product.id === item.product?.id,
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      const count = subtotal(rule, item, productCategory, reqWeightRules);
 | 
					      const feeRule = ProductFeeItems.data.find((feeItem) => feeItem.fee_product_id === item.product?.id);
 | 
				
			||||||
 | 
					      let count;
 | 
				
			||||||
 | 
					      if (!rule && feeRule) {
 | 
				
			||||||
 | 
					        count = subtotal(feeRule, item, productCategory, reqWeightRules, 'fee');
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        count = subtotal(rule, item, productCategory, reqWeightRules);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      count && result.push({ label: '合同', value: count });
 | 
					      count && result.push({ label: '合同', value: count });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // 采购
 | 
					    // 采购
 | 
				
			||||||
@ -78,12 +87,22 @@ export const RecordItemValuationQuantity = observer((props) => {
 | 
				
			|||||||
        const count = subtotal(rule, item, productCategory, reqWeightRules);
 | 
					        const count = subtotal(rule, item, productCategory, reqWeightRules);
 | 
				
			||||||
        count && result.push({ label: '报价', value: count });
 | 
					        count && result.push({ label: '报价', value: count });
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      const leaseRule = inLeaseItems.data.find((leaseItem) =>
 | 
					      const leaseRule = inLeaseItems.data.find((leaseItem) =>
 | 
				
			||||||
        leaseItem.products.find(
 | 
					        leaseItem.products.find(
 | 
				
			||||||
          (product) => product.id - 99999 === item.product?.category_id || product.id === item.product?.id,
 | 
					          (product) => product.id - 99999 === item.product?.category_id || product.id === item.product?.id,
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      const count = subtotal(leaseRule, item, productCategory, reqWeightRules);
 | 
					      const feeRule = inProductFeeItems.data.find(
 | 
				
			||||||
 | 
					        (feeItem) =>
 | 
				
			||||||
 | 
					          feeItem.fee_product_id === item.product?.id || item.product?.category_id === feeItem.fee_product.category_id,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      let count;
 | 
				
			||||||
 | 
					      if (!leaseRule && feeRule) {
 | 
				
			||||||
 | 
					        count = subtotal(feeRule, item, productCategory, reqWeightRules, 'fee');
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        count = subtotal(leaseRule, item, productCategory, reqWeightRules);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      count && result.push({ label: '入库合同', value: count });
 | 
					      count && result.push({ label: '入库合同', value: count });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // 租赁直发
 | 
					    // 租赁直发
 | 
				
			||||||
@ -93,14 +112,32 @@ export const RecordItemValuationQuantity = observer((props) => {
 | 
				
			|||||||
          (product) => product.id - 99999 === item.product?.category_id || product.id === item.product?.id,
 | 
					          (product) => product.id - 99999 === item.product?.category_id || product.id === item.product?.id,
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      const count_out = subtotal(contractPlain_out, item, productCategory, reqWeightRules);
 | 
					      const contractPlain_out_fee = outProductFeeItems.data.find(
 | 
				
			||||||
 | 
					        (feeItem) =>
 | 
				
			||||||
 | 
					          feeItem.fee_product_id === item.product?.id || item.product?.category_id === feeItem.fee_product.category_id,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      let count_out;
 | 
				
			||||||
 | 
					      if (!contractPlain_out && contractPlain_out_fee) {
 | 
				
			||||||
 | 
					        count_out = subtotal(contractPlain_out_fee, item, productCategory, reqWeightRules, 'fee');
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        count_out = subtotal(contractPlain_out, item, productCategory, reqWeightRules);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      count_out && result.push({ label: '出库合同', value: count_out });
 | 
					      count_out && result.push({ label: '出库合同', value: count_out });
 | 
				
			||||||
      const contractPlain_in = inLeaseItems.data.find((leaseItem) =>
 | 
					      const contractPlain_in = inLeaseItems.data.find((leaseItem) =>
 | 
				
			||||||
        leaseItem.products.find(
 | 
					        leaseItem.products.find(
 | 
				
			||||||
          (product) => product.id - 99999 === item.product?.category_id || product.id === item.product?.id,
 | 
					          (product) => product.id - 99999 === item.product?.category_id || product.id === item.product?.id,
 | 
				
			||||||
        ),
 | 
					        ),
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      const count_in = subtotal(contractPlain_in, item, productCategory, reqWeightRules);
 | 
					      const contractPlain_in_fee = outProductFeeItems.data.find(
 | 
				
			||||||
 | 
					        (feeItem) =>
 | 
				
			||||||
 | 
					          feeItem.fee_product_id === item.product?.id || item.product?.category_id === feeItem.fee_product.category_id,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      let count_in;
 | 
				
			||||||
 | 
					      if (!contractPlain_in && contractPlain_in_fee) {
 | 
				
			||||||
 | 
					        count_in = subtotal(contractPlain_in_fee, item, productCategory, reqWeightRules, 'fee');
 | 
				
			||||||
 | 
					      } else {
 | 
				
			||||||
 | 
					        count_in = subtotal(contractPlain_in, item, productCategory, reqWeightRules);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      count_in && result.push({ label: '入库合同', value: count_in });
 | 
					      count_in && result.push({ label: '入库合同', value: count_in });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -119,17 +156,17 @@ RecordItemValuationQuantity.displayName = 'RecordItemValuationQuantity';
 | 
				
			|||||||
RecordItemValuationQuantity.__componentType = CustomComponentType.CUSTOM_FIELD;
 | 
					RecordItemValuationQuantity.__componentType = CustomComponentType.CUSTOM_FIELD;
 | 
				
			||||||
RecordItemValuationQuantity.__componentLabel = '记录单 - 明细 - 计价数量';
 | 
					RecordItemValuationQuantity.__componentLabel = '记录单 - 明细 - 计价数量';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const subtotal = (rule: any, itemData: any, productCategory: any, reqWeightRules: any) => {
 | 
					const subtotal = (rule: any, itemData: any, productCategory: any, reqWeightRules: any, item?: any) => {
 | 
				
			||||||
  let count: number;
 | 
					  let count: number;
 | 
				
			||||||
  let unit: string;
 | 
					  let unit: string;
 | 
				
			||||||
  if (rule?.conversion_logic_id === ConversionLogics.Keep) {
 | 
					  if (rule?.conversion_logic_id === ConversionLogics.Keep) {
 | 
				
			||||||
    count = itemData.count;
 | 
					    count = itemData.count;
 | 
				
			||||||
    unit = productCategory.unit;
 | 
					    unit = item ? rule.unit : productCategory.unit;
 | 
				
			||||||
  } else if (rule?.conversion_logic_id === ConversionLogics.Product) {
 | 
					  } else if (rule?.conversion_logic_id === ConversionLogics.Product) {
 | 
				
			||||||
    count = productCategory.convertible ? itemData.count * itemData.product.ratio : itemData.count;
 | 
					    count = productCategory.convertible ? itemData.count * itemData.product.ratio : itemData.count;
 | 
				
			||||||
    unit = productCategory.convertible ? productCategory.conversion_unit : productCategory.unit;
 | 
					    unit = item ? rule.unit : productCategory.convertible ? productCategory.conversion_unit : productCategory.unit;
 | 
				
			||||||
  } else if (rule?.conversion_logic_id === ConversionLogics.ProductWeight) {
 | 
					  } else if (rule?.conversion_logic_id === ConversionLogics.ProductWeight) {
 | 
				
			||||||
    count = (itemData.count * itemData.product.weight) / 1000;
 | 
					    count = item ? itemData.count : (itemData.count * itemData.product.weight) / 1000;
 | 
				
			||||||
    unit = '吨';
 | 
					    unit = '吨';
 | 
				
			||||||
  } else if (rule?.conversion_logic_id === ConversionLogics.ActualWeight) {
 | 
					  } else if (rule?.conversion_logic_id === ConversionLogics.ActualWeight) {
 | 
				
			||||||
    count = 0;
 | 
					    count = 0;
 | 
				
			||||||
 | 
				
			|||||||
@ -4,7 +4,7 @@ import React from 'react';
 | 
				
			|||||||
import { observer, useForm } from '@formily/react';
 | 
					import { observer, useForm } from '@formily/react';
 | 
				
			||||||
import { RecordCategory } from '../../utils/constants';
 | 
					import { RecordCategory } from '../../utils/constants';
 | 
				
			||||||
import { CustomComponentType, CustomFC } from '@hera/plugin-core/client';
 | 
					import { CustomComponentType, CustomFC } from '@hera/plugin-core/client';
 | 
				
			||||||
import { useCachedRequest, useLeaseItems } from '../hooks';
 | 
					import { useCachedRequest, useLeaseItems, useProductFeeItems } from '../hooks';
 | 
				
			||||||
import { useDeepCompareEffect } from 'ahooks';
 | 
					import { useDeepCompareEffect } from 'ahooks';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const RecordProductScope = observer(() => {
 | 
					export const RecordProductScope = observer(() => {
 | 
				
			||||||
@ -15,36 +15,75 @@ export const RecordProductScope = observer(() => {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  let required = { price: false, contract: false, inContract: false, outContract: false };
 | 
					  let required = { price: false, contract: false, inContract: false, outContract: false };
 | 
				
			||||||
  const { data, loading } = useCachedRequest<any>({
 | 
					  const { data, loading } = useCachedRequest<any>({
 | 
				
			||||||
    resource: 'product_category',
 | 
					    resource: 'product',
 | 
				
			||||||
    action: 'list',
 | 
					    action: 'list',
 | 
				
			||||||
    params: {
 | 
					    params: {
 | 
				
			||||||
      pageSize: 99999,
 | 
					      pageSize: 99999,
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
  const { data: leaseItems, loading: leaseItemsLoading } = useLeaseItems(contractPlanId);
 | 
					  const { data: leaseItems, loading: leaseItemsLoading } = useLeaseItems(contractPlanId);
 | 
				
			||||||
 | 
					  const { data: feeseItems, loading: feeItemsLoading } = useProductFeeItems(contractPlanId);
 | 
				
			||||||
  const { data: inLeaseItems, loading: inLeaseItemsLoading } = useLeaseItems(inContractPlanId);
 | 
					  const { data: inLeaseItems, loading: inLeaseItemsLoading } = useLeaseItems(inContractPlanId);
 | 
				
			||||||
 | 
					  const { data: inFeeseItems, loading: inFeeItemsLoading } = useProductFeeItems(inContractPlanId);
 | 
				
			||||||
  const { data: outLeaseItems, loading: outLeaseItemsLoading } = useLeaseItems(outContractPlanId);
 | 
					  const { data: outLeaseItems, loading: outLeaseItemsLoading } = useLeaseItems(outContractPlanId);
 | 
				
			||||||
 | 
					  const { data: outFeeseItems, loading: outFeeItemsLoading } = useProductFeeItems(outContractPlanId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const contractProducts =
 | 
					  /**
 | 
				
			||||||
    leaseItems?.data.reduce((acc, current) => {
 | 
					   * 合同费用数据格式trans
 | 
				
			||||||
      acc.push(...current.products.map((item) => ({ id: item.category_id })));
 | 
					   */
 | 
				
			||||||
      return acc;
 | 
					  const transFee = (fee: any[]) => {
 | 
				
			||||||
    }, []) ?? [];
 | 
					    if (fee) {
 | 
				
			||||||
 | 
					      const feeData = fee.map((fee) => {
 | 
				
			||||||
 | 
					        const data = {
 | 
				
			||||||
 | 
					          ...fee,
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        data.products = [data.fee_product];
 | 
				
			||||||
 | 
					        return data;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      return feeData || [];
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      return [];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const inContractProducts =
 | 
					  /**
 | 
				
			||||||
    inLeaseItems?.data.reduce((acc, current) => {
 | 
					   * 生成合同产品/费用的id或category_id数据
 | 
				
			||||||
      acc.push(...current.products.map((item) => ({ id: item.category_id })));
 | 
					   */
 | 
				
			||||||
      return acc;
 | 
					  const contractLeaseFee = (leaseData, feeData) => {
 | 
				
			||||||
    }, []) ?? [];
 | 
					    const data =
 | 
				
			||||||
 | 
					      [...leaseData, ...transFee(feeData)].reduce((acc, current) => {
 | 
				
			||||||
  const outContractProducts =
 | 
					        acc.push(
 | 
				
			||||||
    outLeaseItems?.data.reduce((acc, current) => {
 | 
					          ...current.products.map((item) => {
 | 
				
			||||||
      acc.push(...current.products.map((item) => ({ id: item.category_id })));
 | 
					            if (item.id < 99999) {
 | 
				
			||||||
      return acc;
 | 
					              return { id: item.id };
 | 
				
			||||||
    }, []) ?? [];
 | 
					            } else {
 | 
				
			||||||
 | 
					              return { category_id: item.id - 99999 };
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }),
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        return acc;
 | 
				
			||||||
 | 
					      }, []) ?? [];
 | 
				
			||||||
 | 
					    return data;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					  const contractProducts = contractLeaseFee(leaseItems?.data || [], feeseItems?.data);
 | 
				
			||||||
 | 
					  const inContractProducts = contractLeaseFee(inLeaseItems?.data || [], inFeeseItems?.data);
 | 
				
			||||||
 | 
					  const inContractFee = contractLeaseFee([], inFeeseItems?.data);
 | 
				
			||||||
 | 
					  const outContractProducts = contractLeaseFee(outLeaseItems?.data || [], outFeeseItems?.data);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const priceProducts =
 | 
					  const priceProducts =
 | 
				
			||||||
    form.values.price_items?.filter((item) => item.product).map((item) => ({ id: item.product.category_id })) ?? [];
 | 
					    form.values.price_items
 | 
				
			||||||
 | 
					      ?.filter((item) => item.product)
 | 
				
			||||||
 | 
					      .map((item) => {
 | 
				
			||||||
 | 
					        if (item.product.id > 99999) {
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            category_id: item.product.category_id,
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          return {
 | 
				
			||||||
 | 
					            id: item.product.id,
 | 
				
			||||||
 | 
					          };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }) ?? [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  switch (form.values.category) {
 | 
					  switch (form.values.category) {
 | 
				
			||||||
    case RecordCategory.lease:
 | 
					    case RecordCategory.lease:
 | 
				
			||||||
@ -53,10 +92,10 @@ export const RecordProductScope = observer(() => {
 | 
				
			|||||||
    case RecordCategory.purchase:
 | 
					    case RecordCategory.purchase:
 | 
				
			||||||
      required = { price: true, contract: false, inContract: false, outContract: false };
 | 
					      required = { price: true, contract: false, inContract: false, outContract: false };
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case RecordCategory.lease2lease: // 出库合同,入库合同的产品范围交集
 | 
					    case RecordCategory.lease2lease:
 | 
				
			||||||
      required = { price: false, contract: false, inContract: true, outContract: true };
 | 
					      required = { price: false, contract: false, inContract: true, outContract: true };
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case RecordCategory.purchase2lease: // 报价,入库合同的产品范围交集
 | 
					    case RecordCategory.purchase2lease: // 报价,入库合同的产品范围交集, 加入入库合同的费用数据
 | 
				
			||||||
      required = { price: true, contract: false, inContract: true, outContract: false };
 | 
					      required = { price: true, contract: false, inContract: true, outContract: false };
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    case RecordCategory.inventory:
 | 
					    case RecordCategory.inventory:
 | 
				
			||||||
@ -69,24 +108,56 @@ export const RecordProductScope = observer(() => {
 | 
				
			|||||||
  let result = data?.data ?? [];
 | 
					  let result = data?.data ?? [];
 | 
				
			||||||
  if (required.inContract && required.outContract) {
 | 
					  if (required.inContract && required.outContract) {
 | 
				
			||||||
    // 租赁直发单
 | 
					    // 租赁直发单
 | 
				
			||||||
    const intersection = _.intersectionBy(inContractProducts, outContractProducts, 'id');
 | 
					    const intersection = [
 | 
				
			||||||
    result = _.intersectionBy(result, intersection, 'id');
 | 
					      _.intersectionBy(inContractProducts, outContractProducts, 'id'),
 | 
				
			||||||
 | 
					      _.intersectionBy(inContractProducts, outContractProducts, 'category_id'),
 | 
				
			||||||
 | 
					    ].flat();
 | 
				
			||||||
 | 
					    const data = intersectionByMultiple(result, intersection, 'category_id');
 | 
				
			||||||
 | 
					    result = [_.intersectionBy(result, intersection, 'id'), data].flat();
 | 
				
			||||||
  } else if (required.price && required.inContract) {
 | 
					  } else if (required.price && required.inContract) {
 | 
				
			||||||
    const intersection = _.intersectionBy(inContractProducts, priceProducts, 'id');
 | 
					    const intersection = [
 | 
				
			||||||
    result = _.intersectionBy(result, intersection, 'id');
 | 
					      _.intersectionBy(inContractProducts, priceProducts, 'id'),
 | 
				
			||||||
 | 
					      _.intersectionBy(inContractProducts, priceProducts, 'category_id'),
 | 
				
			||||||
 | 
					    ].flat();
 | 
				
			||||||
 | 
					    intersection.push(...inContractFee);
 | 
				
			||||||
 | 
					    const data = intersectionByMultiple(result, intersection, 'category_id');
 | 
				
			||||||
 | 
					    result = [_.intersectionBy(result, intersection, 'id'), data].flat();
 | 
				
			||||||
  } else if (required.price) {
 | 
					  } else if (required.price) {
 | 
				
			||||||
    result = _.intersectionBy(result, priceProducts, 'id');
 | 
					    const data = intersectionByMultiple(result, priceProducts, 'category_id');
 | 
				
			||||||
 | 
					    result = [_.intersectionBy(result, priceProducts, 'id'), data].flat();
 | 
				
			||||||
  } else if (required.contract) {
 | 
					  } else if (required.contract) {
 | 
				
			||||||
    result = _.intersectionBy(result, contractProducts, 'id');
 | 
					    const data = intersectionByMultiple(result, contractProducts, 'category_id');
 | 
				
			||||||
 | 
					    result = [_.intersectionBy(result, contractProducts, 'id'), data].flat();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  useDeepCompareEffect(() => {
 | 
					  useDeepCompareEffect(() => {
 | 
				
			||||||
    form.setValues({
 | 
					    form.setValues({
 | 
				
			||||||
      product_scope: result,
 | 
					      product_scope: result,
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
  }, [result, form]);
 | 
					  }, [result, form]);
 | 
				
			||||||
  return loading || leaseItemsLoading || inLeaseItemsLoading || outLeaseItemsLoading ? <Spin /> : <></>;
 | 
					  return loading ||
 | 
				
			||||||
 | 
					    leaseItemsLoading ||
 | 
				
			||||||
 | 
					    inLeaseItemsLoading ||
 | 
				
			||||||
 | 
					    outLeaseItemsLoading ||
 | 
				
			||||||
 | 
					    feeItemsLoading ||
 | 
				
			||||||
 | 
					    inFeeItemsLoading ||
 | 
				
			||||||
 | 
					    outFeeItemsLoading ? (
 | 
				
			||||||
 | 
					    <Spin />
 | 
				
			||||||
 | 
					  ) : (
 | 
				
			||||||
 | 
					    <></>
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
}) as CustomFC;
 | 
					}) as CustomFC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
RecordProductScope.displayName = 'RecordProductScope';
 | 
					RecordProductScope.displayName = 'RecordProductScope';
 | 
				
			||||||
RecordProductScope.__componentType = CustomComponentType.CUSTOM_ASSOCIATED_FIELD;
 | 
					RecordProductScope.__componentType = CustomComponentType.CUSTOM_ASSOCIATED_FIELD;
 | 
				
			||||||
RecordProductScope.__componentLabel = '记录单 - 产品范围';
 | 
					RecordProductScope.__componentLabel = '记录单 - 产品范围';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const intersectionByMultiple = (arr1, arr2, propName) => {
 | 
				
			||||||
 | 
					  const result = [];
 | 
				
			||||||
 | 
					  arr1.forEach((item) => {
 | 
				
			||||||
 | 
					    const index = arr2.findIndex((i) => i[propName] === item[propName]);
 | 
				
			||||||
 | 
					    if (index !== -1) {
 | 
				
			||||||
 | 
					      result.push(item);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  return result;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
				
			|||||||
@ -30,6 +30,30 @@ export const useLeaseItems = (planId) => {
 | 
				
			|||||||
  return { data, loading };
 | 
					  return { data, loading };
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const useProductFeeItems = (planId) => {
 | 
				
			||||||
 | 
					  const feeParams = {
 | 
				
			||||||
 | 
					    resource: 'contract_plan_fee_items',
 | 
				
			||||||
 | 
					    action: 'list',
 | 
				
			||||||
 | 
					    params: {
 | 
				
			||||||
 | 
					      appends: ['fee_product'],
 | 
				
			||||||
 | 
					      filter: {
 | 
				
			||||||
 | 
					        contract_plan_id: planId,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      pageSize: 99999,
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const { data, loading, run } = useCachedRequest<any>(feeParams, {
 | 
				
			||||||
 | 
					    manual: true,
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    if (planId) {
 | 
				
			||||||
 | 
					      run();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }, [planId]);
 | 
				
			||||||
 | 
					  return { data, loading };
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const useFeeItems = (categoryId, planId) => {
 | 
					export const useFeeItems = (categoryId, planId) => {
 | 
				
			||||||
  const { data, loading, run } = useCachedRequest<any>(
 | 
					  const { data, loading, run } = useCachedRequest<any>(
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
				
			|||||||
@ -133,6 +133,7 @@ const styles = StyleSheet.create({
 | 
				
			|||||||
    marginLeft: '-1px',
 | 
					    marginLeft: '-1px',
 | 
				
			||||||
    borderTop: '1px solid black',
 | 
					    borderTop: '1px solid black',
 | 
				
			||||||
    marginTop: '-1px',
 | 
					    marginTop: '-1px',
 | 
				
			||||||
 | 
					    borderBottom: '1px solid black',
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  tableCellLast: {
 | 
					  tableCellLast: {
 | 
				
			||||||
    flex: 1,
 | 
					    flex: 1,
 | 
				
			||||||
@ -302,6 +303,81 @@ const PreviewDocument = ({
 | 
				
			|||||||
      dobuleRecord.push(result);
 | 
					      dobuleRecord.push(result);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  const renderRecord = (data, isDouble) => {
 | 
				
			||||||
 | 
					    const columns = isDouble ? ['left_', 'right_'] : [''];
 | 
				
			||||||
 | 
					    const page = data.map((item, index) => (
 | 
				
			||||||
 | 
					      <View key={index} style={styles.tableContent}>
 | 
				
			||||||
 | 
					        {columns.map((column, columnIndex) => (
 | 
				
			||||||
 | 
					          <React.Fragment key={columnIndex}>
 | 
				
			||||||
 | 
					            <Text style={styles.tableCell2}>{item[column + 'name']}</Text>
 | 
				
			||||||
 | 
					            <Text style={styles.tableCell}>
 | 
				
			||||||
 | 
					              {!item[column + 'count'] ? '' : formatQuantity(item[column + 'count'], 2) + item[column + 'unit']}
 | 
				
			||||||
 | 
					            </Text>
 | 
				
			||||||
 | 
					            <Text style={styles.tableCell}>
 | 
				
			||||||
 | 
					              {!item[column + 'total']
 | 
				
			||||||
 | 
					                ? ''
 | 
				
			||||||
 | 
					                : formatQuantity(item[column + 'total'], 2) + item[column + 'conversion_unit']}
 | 
				
			||||||
 | 
					            </Text>
 | 
				
			||||||
 | 
					            <Text style={!isDouble || column === 'right_' ? styles.tableCellLast : styles.tableCell}>
 | 
				
			||||||
 | 
					              {item[column + 'isExcluded']
 | 
				
			||||||
 | 
					                ? '不计入合同  ' + (item[column + 'comment'] || '')
 | 
				
			||||||
 | 
					                : item[column + 'comment'] || ''}
 | 
				
			||||||
 | 
					            </Text>
 | 
				
			||||||
 | 
					          </React.Fragment>
 | 
				
			||||||
 | 
					        ))}
 | 
				
			||||||
 | 
					      </View>
 | 
				
			||||||
 | 
					    ));
 | 
				
			||||||
 | 
					    let addCol = <></>;
 | 
				
			||||||
 | 
					    if (detail.category === RecordCategory.purchase) {
 | 
				
			||||||
 | 
					      const allprice = getAllPrice();
 | 
				
			||||||
 | 
					      addCol = (
 | 
				
			||||||
 | 
					        <View style={styles.tableContent}>
 | 
				
			||||||
 | 
					          {columns.map((column, columnIndex) => (
 | 
				
			||||||
 | 
					            <React.Fragment key={columnIndex}>
 | 
				
			||||||
 | 
					              <Text style={styles.tableCell2}></Text>
 | 
				
			||||||
 | 
					              <Text style={styles.tableCell}>{column === 'left_' ? '' : '总金额'}</Text>
 | 
				
			||||||
 | 
					              <Text style={styles.tableCell}>{column === 'left_' ? '' : allprice}</Text>
 | 
				
			||||||
 | 
					              <Text style={!isDouble || column === 'right_' ? styles.tableCellLast : styles.tableCell}></Text>
 | 
				
			||||||
 | 
					            </React.Fragment>
 | 
				
			||||||
 | 
					          ))}
 | 
				
			||||||
 | 
					        </View>
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return detail.category === RecordCategory.purchase ? (
 | 
				
			||||||
 | 
					      <>
 | 
				
			||||||
 | 
					        {page}
 | 
				
			||||||
 | 
					        {addCol}
 | 
				
			||||||
 | 
					      </>
 | 
				
			||||||
 | 
					    ) : (
 | 
				
			||||||
 | 
					      page
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const renderPrice = (data, isDouble) => {
 | 
				
			||||||
 | 
					    const columns = isDouble ? ['left_', 'right_'] : [''];
 | 
				
			||||||
 | 
					    return data.map((item, index) => (
 | 
				
			||||||
 | 
					      <View key={index} style={styles.tableContent}>
 | 
				
			||||||
 | 
					        {columns.map((column, columnIndex) => (
 | 
				
			||||||
 | 
					          <React.Fragment key={columnIndex}>
 | 
				
			||||||
 | 
					            <Text style={styles.tableCell2}>{item[column + 'name']}</Text>
 | 
				
			||||||
 | 
					            <Text style={styles.tableCell}>
 | 
				
			||||||
 | 
					              {formatQuantity(item[column + 'unit_price'], 2) + '元/' + item[column + 'unit']}
 | 
				
			||||||
 | 
					            </Text>
 | 
				
			||||||
 | 
					            <Text style={styles.tableCell}>
 | 
				
			||||||
 | 
					              {formatQuantity(item[column + 'count'], 2)}
 | 
				
			||||||
 | 
					              {item[column + 'unit']}
 | 
				
			||||||
 | 
					            </Text>
 | 
				
			||||||
 | 
					            <Text style={styles.tableCell}>{formatCurrency(item[column + 'all_price'], 2)}</Text>
 | 
				
			||||||
 | 
					            <Text style={!isDouble || column === 'right_' ? styles.tableCellLast : styles.tableCell}>
 | 
				
			||||||
 | 
					              {item[column + 'comment'] || ''}
 | 
				
			||||||
 | 
					            </Text>
 | 
				
			||||||
 | 
					          </React.Fragment>
 | 
				
			||||||
 | 
					        ))}
 | 
				
			||||||
 | 
					      </View>
 | 
				
			||||||
 | 
					    ));
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Document>
 | 
					    <Document>
 | 
				
			||||||
      <Page size="A4" style={{ ...styles.page, marginTop: detail.margingTop }}>
 | 
					      <Page size="A4" style={{ ...styles.page, marginTop: detail.margingTop }}>
 | 
				
			||||||
@ -365,216 +441,44 @@ const PreviewDocument = ({
 | 
				
			|||||||
                <Text style={styles.headerLeftRight}>车号:{car}</Text>
 | 
					                <Text style={styles.headerLeftRight}>车号:{car}</Text>
 | 
				
			||||||
              </View>
 | 
					              </View>
 | 
				
			||||||
            )}
 | 
					            )}
 | 
				
			||||||
            {/* 单列定价 */}
 | 
					            {/* 定价 */}
 | 
				
			||||||
            {!isDouble && detail.category === RecordCategory.purchase && (
 | 
					            {detail.category === RecordCategory.purchase && (
 | 
				
			||||||
              <View style={styles.tableContentTitle}>
 | 
					              <View style={styles.tableContentTitle}>
 | 
				
			||||||
                <Text style={styles.tableCellLargeTitle}>物料名称及规格</Text>
 | 
					                <Text style={styles.tableCellLargeTitle}>物料名称及规格</Text>
 | 
				
			||||||
                <Text style={styles.tableCellTitle}>单价</Text>
 | 
					                <Text style={styles.tableCellTitle}>单价</Text>
 | 
				
			||||||
                <Text style={styles.tableCellTitle}>数量</Text>
 | 
					                <Text style={styles.tableCellTitle}>数量</Text>
 | 
				
			||||||
                <Text style={styles.tableCellTitle}>金额</Text>
 | 
					                <Text style={styles.tableCellTitle}>金额</Text>
 | 
				
			||||||
                <Text style={styles.tableCellTitleLast}>备注</Text>
 | 
					                <Text style={!isDouble ? styles.tableCellTitleLast : styles.tableCellTitle}>备注</Text>
 | 
				
			||||||
 | 
					                {isDouble && (
 | 
				
			||||||
 | 
					                  <>
 | 
				
			||||||
 | 
					                    <Text style={styles.tableCellLargeTitle}>物料名称及规格</Text>
 | 
				
			||||||
 | 
					                    <Text style={styles.tableCellTitle}>单价</Text>
 | 
				
			||||||
 | 
					                    <Text style={styles.tableCellTitle}>数量</Text>
 | 
				
			||||||
 | 
					                    <Text style={styles.tableCellTitle}>金额</Text>
 | 
				
			||||||
 | 
					                    <Text style={styles.tableCellTitleLast}>备注</Text>
 | 
				
			||||||
 | 
					                  </>
 | 
				
			||||||
 | 
					                )}
 | 
				
			||||||
              </View>
 | 
					              </View>
 | 
				
			||||||
            )}
 | 
					            )}
 | 
				
			||||||
            {!isDouble &&
 | 
					            {detail.category === RecordCategory.purchase &&
 | 
				
			||||||
              detail.category === RecordCategory.purchase &&
 | 
					              renderPrice(isDouble ? dobulePriceRule : priceRule, isDouble)}
 | 
				
			||||||
              priceRule.length &&
 | 
					 | 
				
			||||||
              priceRule.map((item) => (
 | 
					 | 
				
			||||||
                <View key={'key'} style={styles.tableContent}>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell2}>{item.name}</Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>
 | 
					 | 
				
			||||||
                    {item?.unit_price && formatQuantity(item.unit_price, 2) + '元/' + item.unit}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>
 | 
					 | 
				
			||||||
                    {formatQuantity(item.count, 2)}
 | 
					 | 
				
			||||||
                    {item.unit}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>{formatCurrency(item.all_price, 2)}</Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCellLast}>{item.comment || ''}</Text>
 | 
					 | 
				
			||||||
                </View>
 | 
					 | 
				
			||||||
              ))}
 | 
					 | 
				
			||||||
            {/* 双列定价 */}
 | 
					 | 
				
			||||||
            {isDouble && detail.category === RecordCategory.purchase && (
 | 
					 | 
				
			||||||
              <View style={styles.tableContentTitle}>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellLargeTitle}>物料名称及规格</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellTitle}>单价</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellTitle}>数量</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellTitle}>金额</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellTitle}>备注</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellLargeTitle}>物料名称及规格</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellTitle}>单价</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellTitle}>数量</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellTitle}>金额</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellTitleLast}>备注</Text>
 | 
					 | 
				
			||||||
              </View>
 | 
					 | 
				
			||||||
            )}
 | 
					 | 
				
			||||||
            {isDouble &&
 | 
					 | 
				
			||||||
              detail.category === RecordCategory.purchase &&
 | 
					 | 
				
			||||||
              priceRule.length &&
 | 
					 | 
				
			||||||
              dobulePriceRule.map((item) => (
 | 
					 | 
				
			||||||
                <View key={'key'} style={styles.tableContent}>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell2}>{item.left_name}</Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>
 | 
					 | 
				
			||||||
                    {item?.left_unit_price && formatQuantity(item.left_unit_price, 2) + '元/' + item.left_unit}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>
 | 
					 | 
				
			||||||
                    {formatQuantity(item.left_count, 2)}
 | 
					 | 
				
			||||||
                    {item.left_unit}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>{formatCurrency(item.left_all_price, 2)}</Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>{item.left_comment || ''}</Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell2}>{item.right_name}</Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>
 | 
					 | 
				
			||||||
                    {item?.right_unit_price && formatQuantity(item.right_unit_price, 2) + '元/' + item.right_unit}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>
 | 
					 | 
				
			||||||
                    {item.right_count && formatQuantity(item.right_count)}
 | 
					 | 
				
			||||||
                    {item.right_unit}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>
 | 
					 | 
				
			||||||
                    {item.right_all_price && formatCurrency(item.right_all_price, 2)}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCellLast}>{item.right_comment || ''}</Text>
 | 
					 | 
				
			||||||
                </View>
 | 
					 | 
				
			||||||
              ))}
 | 
					 | 
				
			||||||
            {/* ============================================================两表分割================================================================================= */}
 | 
					            {/* ============================================================两表分割================================================================================= */}
 | 
				
			||||||
            {/* 单列租金及费用 */}
 | 
					            {/* 单列租金及费用 */}
 | 
				
			||||||
            {!isDouble && (
 | 
					            <View style={styles.tableContentTitle}>
 | 
				
			||||||
              <View style={styles.tableContentTitle}>
 | 
					              <Text style={styles.tableCellLargeTitle}>物料名称及规格</Text>
 | 
				
			||||||
                <Text style={styles.tableCellLargeTitle}>物料名称及规格</Text>
 | 
					              <Text style={styles.tableCellTitle}>数量</Text>
 | 
				
			||||||
                <Text style={styles.tableCellTitle}>数量</Text>
 | 
					              <Text style={styles.tableCellTitle}>小计</Text>
 | 
				
			||||||
                <Text style={styles.tableCellTitle}>小计</Text>
 | 
					              <Text style={!isDouble ? styles.tableCellTitleLast : styles.tableCellTitle}>备注</Text>
 | 
				
			||||||
                <Text
 | 
					              {isDouble && (
 | 
				
			||||||
                  style={
 | 
					                <>
 | 
				
			||||||
                    detail.category === RecordCategory.purchase ? styles.tableCell2TitleLast : styles.tableCellTitleLast
 | 
					                  <Text style={styles.tableCellLargeTitle}>物料名称及规格</Text>
 | 
				
			||||||
                  }
 | 
					                  <Text style={styles.tableCellTitle}>数量</Text>
 | 
				
			||||||
                >
 | 
					                  <Text style={styles.tableCellTitle}>小计</Text>
 | 
				
			||||||
                  备注
 | 
					                  <Text style={styles.tableCellTitleLast}>备注</Text>
 | 
				
			||||||
                </Text>
 | 
					                </>
 | 
				
			||||||
              </View>
 | 
					              )}
 | 
				
			||||||
            )}
 | 
					            </View>
 | 
				
			||||||
            {!isDouble &&
 | 
					            {renderRecord(isDouble ? dobuleRecord : record, isDouble)}
 | 
				
			||||||
              record.map((item) => (
 | 
					 | 
				
			||||||
                <View key={'key'} style={styles.tableContent}>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell2}>{item.name}</Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>
 | 
					 | 
				
			||||||
                    {!item.count || item.isFee ? '' : formatQuantity(item.count, 2) + item.unit}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>
 | 
					 | 
				
			||||||
                    {(printSetup === PrintSetup.Display && !item.product_id && !item.isTotal) ||
 | 
					 | 
				
			||||||
                    (printSetup === PrintSetup.Manual && !item.product_id && !item.isTotal)
 | 
					 | 
				
			||||||
                      ? ''
 | 
					 | 
				
			||||||
                      : item.total
 | 
					 | 
				
			||||||
                        ? formatQuantity(item.total, 2)
 | 
					 | 
				
			||||||
                        : ''}
 | 
					 | 
				
			||||||
                    {item.isFee && !item.product_id // 判断未无产品关联费用
 | 
					 | 
				
			||||||
                      ? printSetup === PrintSetup.DisplayAndPrice && item.total
 | 
					 | 
				
			||||||
                        ? '元'
 | 
					 | 
				
			||||||
                        : ''
 | 
					 | 
				
			||||||
                      : item.conversion_unit}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text
 | 
					 | 
				
			||||||
                    style={detail.category === RecordCategory.purchase ? styles.tableCell2Last : styles.tableCellLast}
 | 
					 | 
				
			||||||
                  >
 | 
					 | 
				
			||||||
                    {item.isExcluded ? '不计入合同  ' + (item.comment || '') : item.comment || ''}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                </View>
 | 
					 | 
				
			||||||
              ))}
 | 
					 | 
				
			||||||
            {!isDouble && detail.category === RecordCategory.purchase && (
 | 
					 | 
				
			||||||
              <View key={'key'} style={styles.tableContent}>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCell2}></Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCell}>总金额</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCell}>{getAllPrice()}</Text>
 | 
					 | 
				
			||||||
                <Text
 | 
					 | 
				
			||||||
                  style={detail.category === RecordCategory.purchase ? styles.tableCell2Last : styles.tableCellLast}
 | 
					 | 
				
			||||||
                ></Text>
 | 
					 | 
				
			||||||
              </View>
 | 
					 | 
				
			||||||
            )}
 | 
					 | 
				
			||||||
            {/* 双列租及费用 */}
 | 
					 | 
				
			||||||
            {isDouble && (
 | 
					 | 
				
			||||||
              <View style={styles.tableContentTitle}>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellLargeTitle}>物料名称及规格</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellTitle}>数量</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellTitle}>小计</Text>
 | 
					 | 
				
			||||||
                <Text
 | 
					 | 
				
			||||||
                  style={detail.category === RecordCategory.purchase ? styles.tableCell2Title : styles.tableCellTitle}
 | 
					 | 
				
			||||||
                >
 | 
					 | 
				
			||||||
                  备注
 | 
					 | 
				
			||||||
                </Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellLargeTitle}>物料名称及规格</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellTitle}>数量</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCellTitle}>小计</Text>
 | 
					 | 
				
			||||||
                <Text
 | 
					 | 
				
			||||||
                  style={
 | 
					 | 
				
			||||||
                    detail.category === RecordCategory.purchase ? styles.tableCell2TitleLast : styles.tableCellTitleLast
 | 
					 | 
				
			||||||
                  }
 | 
					 | 
				
			||||||
                >
 | 
					 | 
				
			||||||
                  备注
 | 
					 | 
				
			||||||
                </Text>
 | 
					 | 
				
			||||||
              </View>
 | 
					 | 
				
			||||||
            )}
 | 
					 | 
				
			||||||
            {isDouble &&
 | 
					 | 
				
			||||||
              dobuleRecord.map((item) => (
 | 
					 | 
				
			||||||
                <View key={'key'} style={styles.tableContent}>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell2}>{item.left_name}</Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>
 | 
					 | 
				
			||||||
                    {!item.left_count || item.left_isFee ? '' : formatQuantity(item.left_count, 2) + item.left_unit}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>
 | 
					 | 
				
			||||||
                    {(printSetup === PrintSetup.Display && !item.left_product_id && !item.left_isTotal) ||
 | 
					 | 
				
			||||||
                    (printSetup === PrintSetup.Manual && !item.left_product_id && !item.left_isTotal)
 | 
					 | 
				
			||||||
                      ? ''
 | 
					 | 
				
			||||||
                      : item.left_total
 | 
					 | 
				
			||||||
                        ? formatQuantity(item.left_total, 2)
 | 
					 | 
				
			||||||
                        : ''}
 | 
					 | 
				
			||||||
                    {item.left_isFee && !item.left_product_id // 判断未无产品关联费用
 | 
					 | 
				
			||||||
                      ? printSetup === PrintSetup.DisplayAndPrice && item.left_total
 | 
					 | 
				
			||||||
                        ? '元'
 | 
					 | 
				
			||||||
                        : '' // 不记录合同不需要单位
 | 
					 | 
				
			||||||
                      : item.left_conversion_unit}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text style={detail.category === RecordCategory.purchase ? styles.tableCell2 : styles.tableCell}>
 | 
					 | 
				
			||||||
                    {item.left_isExcluded ? '不计入合同  ' + (item.left_comment || '') : item.left_comment || ''}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell2}>{item.right_name}</Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>
 | 
					 | 
				
			||||||
                    {!item.right_count || item.right_isFee ? '' : formatQuantity(item.right_count, 2) + item.right_unit}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text style={styles.tableCell}>
 | 
					 | 
				
			||||||
                    {(printSetup === PrintSetup.Display && !item.right_product_id && !item.right_isTotal) ||
 | 
					 | 
				
			||||||
                    (printSetup === PrintSetup.Manual && !item.right_product_id && !item.right_isTotal)
 | 
					 | 
				
			||||||
                      ? ''
 | 
					 | 
				
			||||||
                      : item.right_total
 | 
					 | 
				
			||||||
                        ? formatQuantity(item.right_total, 2)
 | 
					 | 
				
			||||||
                        : ''}
 | 
					 | 
				
			||||||
                    {item.right_isFee && !item.right_product_id // 判断未无产品关联费用
 | 
					 | 
				
			||||||
                      ? printSetup === PrintSetup.DisplayAndPrice && item.right_total
 | 
					 | 
				
			||||||
                        ? '元'
 | 
					 | 
				
			||||||
                        : '' // 不记录合同不需要单位
 | 
					 | 
				
			||||||
                      : item.right_conversion_unit}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                  <Text
 | 
					 | 
				
			||||||
                    style={detail.category === RecordCategory.purchase ? styles.tableCell2Last : styles.tableCellLast}
 | 
					 | 
				
			||||||
                  >
 | 
					 | 
				
			||||||
                    {item.right_name && item.right_isExcluded
 | 
					 | 
				
			||||||
                      ? '不计入合同  ' + (item.right_comment || '')
 | 
					 | 
				
			||||||
                      : item.right_comment || ''}
 | 
					 | 
				
			||||||
                  </Text>
 | 
					 | 
				
			||||||
                </View>
 | 
					 | 
				
			||||||
              ))}
 | 
					 | 
				
			||||||
            {isDouble && detail.category === RecordCategory.purchase && (
 | 
					 | 
				
			||||||
              <View key={'key'} style={styles.tableContent}>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCell2}></Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCell}></Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCell}></Text>
 | 
					 | 
				
			||||||
                <Text style={detail.category === RecordCategory.purchase ? styles.tableCell2 : styles.tableCell}></Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCell2}></Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCell}>总金额</Text>
 | 
					 | 
				
			||||||
                <Text style={styles.tableCell}>{getAllPrice()}</Text>
 | 
					 | 
				
			||||||
                <Text
 | 
					 | 
				
			||||||
                  style={detail.category === RecordCategory.purchase ? styles.tableCell2Last : styles.tableCellLast}
 | 
					 | 
				
			||||||
                ></Text>
 | 
					 | 
				
			||||||
              </View>
 | 
					 | 
				
			||||||
            )}
 | 
					 | 
				
			||||||
            <View style={styles.tableFooter}>
 | 
					            <View style={styles.tableFooter}>
 | 
				
			||||||
              <View style={styles.tableFooterQr}>
 | 
					              <View style={styles.tableFooterQr}>
 | 
				
			||||||
                <Image src={imageUrl} />
 | 
					                <Image src={imageUrl} />
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,14 @@
 | 
				
			|||||||
import { ConversionLogics, RecordCategory, RulesNumber, SourcesType, countCource } from '../../utils/constants';
 | 
					import { ConversionLogics, RecordCategory, RulesNumber, SourcesType, countCource } from '../../utils/constants';
 | 
				
			||||||
import { renderItV2 } from '../pdf-documents/records-documentV2';
 | 
					import { renderItV2 } from '../pdf-documents/records-documentV2';
 | 
				
			||||||
import { Service } from '@nocobase/utils';
 | 
					import { Db, Service } from '@nocobase/utils';
 | 
				
			||||||
import { RecordPdfOptions } from '../../interfaces/options';
 | 
					import { RecordPdfOptions } from '../../interfaces/options';
 | 
				
			||||||
import { PrintSetup } from '../../utils/system';
 | 
					import { PrintSetup } from '../../utils/system';
 | 
				
			||||||
 | 
					import Database from '@nocobase/database';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@Service()
 | 
					@Service()
 | 
				
			||||||
export class RecordPdfService {
 | 
					export class RecordPdfService {
 | 
				
			||||||
 | 
					  @Db()
 | 
				
			||||||
 | 
					  private db: Database;
 | 
				
			||||||
  async transformPdfV2(recordData: any, lease_data: any, fee_data: any, options: RecordPdfOptions) {
 | 
					  async transformPdfV2(recordData: any, lease_data: any, fee_data: any, options: RecordPdfOptions) {
 | 
				
			||||||
    const { isDouble, printSetup } = options;
 | 
					    const { isDouble, printSetup } = options;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -79,7 +82,7 @@ export class RecordPdfService {
 | 
				
			|||||||
      make_price = setData;
 | 
					      make_price = setData;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 计算租金数据
 | 
					    // !产品
 | 
				
			||||||
    const leaseData = lease_data
 | 
					    const leaseData = lease_data
 | 
				
			||||||
      .map((lease) => {
 | 
					      .map((lease) => {
 | 
				
			||||||
        const data = {
 | 
					        const data = {
 | 
				
			||||||
@ -117,8 +120,7 @@ export class RecordPdfService {
 | 
				
			|||||||
      })
 | 
					      })
 | 
				
			||||||
      .sort((a, b) => a.category_id - b.category_id);
 | 
					      .sort((a, b) => a.category_id - b.category_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 计算费用数据,包括有产品关联跟无产品关联
 | 
					    // !产品赔偿
 | 
				
			||||||
    // 关联产品的赔偿(人工录入/全部)
 | 
					 | 
				
			||||||
    const product_fee =
 | 
					    const product_fee =
 | 
				
			||||||
      printSetup === PrintSetup.Manual
 | 
					      printSetup === PrintSetup.Manual
 | 
				
			||||||
        ? fee_data.filter((item) => item.product_id && item.count_source === SourcesType.staff)
 | 
					        ? fee_data.filter((item) => item.product_id && item.count_source === SourcesType.staff)
 | 
				
			||||||
@ -148,68 +150,109 @@ export class RecordPdfService {
 | 
				
			|||||||
        category_id: item.product_category_id,
 | 
					        category_id: item.product_category_id,
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      if (item.conversion_logic_id === ConversionLogics.Keep) {
 | 
					      if (item.conversion_logic_id === ConversionLogics.Keep) {
 | 
				
			||||||
        data['count'] = data.count1;
 | 
					        data['total'] = data.count1;
 | 
				
			||||||
      } else if (item.conversion_logic_id === ConversionLogics.Product) {
 | 
					      } else if (item.conversion_logic_id === ConversionLogics.Product) {
 | 
				
			||||||
        if (item.convertible) data['count'] = data.count1 * item.product_ratio;
 | 
					        if (item.convertible) data['total'] = data.count1 * item.product_ratio;
 | 
				
			||||||
        else data['count'] = data.count1;
 | 
					        else data['total'] = data.count1;
 | 
				
			||||||
      } else if (item.conversion_logic_id === ConversionLogics.ProductWeight) {
 | 
					      } else if (item.conversion_logic_id === ConversionLogics.ProductWeight) {
 | 
				
			||||||
        data['count'] = data.count1 * item.product_weight;
 | 
					        data['total'] = data.count1 * item.product_weight;
 | 
				
			||||||
      } else if (item.conversion_logic_id === ConversionLogics.ActualWeight) {
 | 
					      } else if (item.conversion_logic_id === ConversionLogics.ActualWeight) {
 | 
				
			||||||
        data['count'] = item.actual_weight || item.record_weight;
 | 
					        data['total'] = item.actual_weight || item.record_weight;
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        if (item.weight_rules?.conversion_logic_id === ConversionLogics.Keep) {
 | 
					        if (item.weight_rules?.conversion_logic_id === ConversionLogics.Keep) {
 | 
				
			||||||
          data['count'] = data.count1 * item.weight_rules.weight;
 | 
					          data['total'] = data.count1 * item.weight_rules.weight;
 | 
				
			||||||
        } else if (item.weight_rules?.conversion_logic_id === ConversionLogics.Product) {
 | 
					        } else if (item.weight_rules?.conversion_logic_id === ConversionLogics.Product) {
 | 
				
			||||||
          data['count'] = data.count1 * item.weight_rules.weight * item.product_ratio;
 | 
					          data['total'] = data.count1 * item.weight_rules.weight * item.product_ratio;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      // 如果 printSetup === PrintSetup.DisplayAndPrice 要计算费用产生的价格
 | 
					      data['conversion_unit'] = item.unit;
 | 
				
			||||||
      if (printSetup === PrintSetup.DisplayAndPrice) {
 | 
					      if (printSetup === PrintSetup.DisplayAndPrice) {
 | 
				
			||||||
        data['total'] = data['count'] * item.unit_price;
 | 
					        data['count'] = data['total'];
 | 
				
			||||||
 | 
					        data['total'] = data['total'] * item.unit_price;
 | 
				
			||||||
        data['conversion_unit'] = '元';
 | 
					        data['conversion_unit'] = '元';
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      return data;
 | 
					      return data;
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    // 无关联产品赔偿, 人工录取的情况直接为空,因为excludedFee已经处理,正常情况取非手动录入情况数据,excludedFee已经处理
 | 
					    // !无关联赔偿 item中
 | 
				
			||||||
 | 
					    let manualData = [];
 | 
				
			||||||
 | 
					    const noProductFee = fee_data.filter((item) => !item.product_id && item.count_source === SourcesType.staff);
 | 
				
			||||||
 | 
					    if (noProductFee.length) {
 | 
				
			||||||
 | 
					      const itemFee = await this.db.sequelize.query(`
 | 
				
			||||||
 | 
					        select ri.product_id, ri.count, p.category_id, ri.comment
 | 
				
			||||||
 | 
					        from records r
 | 
				
			||||||
 | 
					        left join record_items ri on ri.record_id = r.id and ri.product_id in (${noProductFee.map((item) => item.fee_product_id).join(',')})
 | 
				
			||||||
 | 
					        join product p on p.id = ri.product_id
 | 
				
			||||||
 | 
					        where r.id = ${recordData.id}
 | 
				
			||||||
 | 
					      `);
 | 
				
			||||||
 | 
					      const result: any = itemFee[0];
 | 
				
			||||||
 | 
					      manualData = result.map((item) => {
 | 
				
			||||||
 | 
					        const feeRule = noProductFee.find((f) => f.fee_product_id === item.product_id);
 | 
				
			||||||
 | 
					        if (!feeRule) return;
 | 
				
			||||||
 | 
					        const data = {
 | 
				
			||||||
 | 
					          name: feeRule.custom_name || feeRule.label,
 | 
				
			||||||
 | 
					          unit: feeRule.unit,
 | 
				
			||||||
 | 
					          conversion_unit: feeRule.unit,
 | 
				
			||||||
 | 
					          comment: item.comment || '',
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        if (feeRule.conversion_logic_id === ConversionLogics.Keep) {
 | 
				
			||||||
 | 
					          data['total'] = item.count;
 | 
				
			||||||
 | 
					        } else if (feeRule.conversion_logic_id === ConversionLogics.Product) {
 | 
				
			||||||
 | 
					          data['total'] = feeRule.convertible ? item.count * feeRule.product_ratio : item.count;
 | 
				
			||||||
 | 
					        } else if (feeRule.conversion_logic_id === ConversionLogics.ProductWeight) {
 | 
				
			||||||
 | 
					          data['total'] = item.count * feeRule.weight;
 | 
				
			||||||
 | 
					        } else if (feeRule.conversion_logic_id === ConversionLogics.ActualWeight) {
 | 
				
			||||||
 | 
					          data['total'] = feeRule.record_weight;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          const weight_rule = item.weight_rules.find(
 | 
				
			||||||
 | 
					            (l) => l.product_id === item.product_id || l.product - RulesNumber === item.category_id,
 | 
				
			||||||
 | 
					          );
 | 
				
			||||||
 | 
					          if (weight_rule && weight_rule.conversion_logic_id === ConversionLogics.Keep) {
 | 
				
			||||||
 | 
					            return item.count * weight_rule.weight;
 | 
				
			||||||
 | 
					          } else if (weight_rule && weight_rule.conversion_logic_id === ConversionLogics.Product) {
 | 
				
			||||||
 | 
					            return item.count * feeRule.product_ratio * weight_rule.weight;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (printSetup === PrintSetup.DisplayAndPrice) {
 | 
				
			||||||
 | 
					          data['count'] = data['total'];
 | 
				
			||||||
 | 
					          data['total'] = data['total'] * feeRule.unit_price;
 | 
				
			||||||
 | 
					          data['conversion_unit'] = '元';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return data;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // !无关联赔偿,出入库量
 | 
				
			||||||
    const fee =
 | 
					    const fee =
 | 
				
			||||||
      printSetup === PrintSetup.Manual
 | 
					      printSetup === PrintSetup.Manual
 | 
				
			||||||
        ? []
 | 
					        ? []
 | 
				
			||||||
        : fee_data.filter((item) => !item.product_id && item.count_source !== SourcesType.staff);
 | 
					        : fee_data.filter((item) => !item.product_id && item.count_source !== SourcesType.staff);
 | 
				
			||||||
    const no_product_fee = fee
 | 
					    const no_product_fee = fee
 | 
				
			||||||
      .map((item) => {
 | 
					      .map((item) => {
 | 
				
			||||||
        // 购销/暂存/盘点无费用信息
 | 
					 | 
				
			||||||
        if (
 | 
					        if (
 | 
				
			||||||
          recordData.category === RecordCategory.purchase ||
 | 
					          recordData.category === RecordCategory.purchase ||
 | 
				
			||||||
          recordData.category === RecordCategory.staging ||
 | 
					          recordData.category === RecordCategory.staging ||
 | 
				
			||||||
          recordData.category === RecordCategory.inventory
 | 
					          recordData.category === RecordCategory.inventory
 | 
				
			||||||
        )
 | 
					        ) {
 | 
				
			||||||
          return;
 | 
					          return;
 | 
				
			||||||
        if (item.count_source === countCource.artificial) {
 | 
					 | 
				
			||||||
          const data = recordData.record_fee_items?.find((hava) => hava.product?.id === item.fee_product_id);
 | 
					 | 
				
			||||||
          if (!data) return;
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (item.record_movement === '-1' && item.count_source === SourcesType.inbound) return;
 | 
					        if (item.record_movement === '-1' && item.count_source === SourcesType.inbound) return;
 | 
				
			||||||
        if (item.record_movement === '1' && item.count_source === SourcesType.outbound) return;
 | 
					        if (item.record_movement === '1' && item.count_source === SourcesType.outbound) return;
 | 
				
			||||||
        const data = {
 | 
					        const data = {
 | 
				
			||||||
          isFee: true,
 | 
					          isFee: true,
 | 
				
			||||||
          name: item.custom_name || item.label,
 | 
					          name: item.custom_name || item.label,
 | 
				
			||||||
          unit: '',
 | 
					          unit: item.unit,
 | 
				
			||||||
          conversion_unit: item.unit,
 | 
					 | 
				
			||||||
          comment: '',
 | 
					          comment: '',
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (item.conversion_logic_id === ConversionLogics.Keep) {
 | 
					        if (item.conversion_logic_id === ConversionLogics.Keep) {
 | 
				
			||||||
          data['count'] = lease_data.reduce((a, b) => a + b.count, 0);
 | 
					          data['total'] = lease_data.reduce((a, b) => a + b.count, 0);
 | 
				
			||||||
        } else if (item.conversion_logic_id === ConversionLogics.Product) {
 | 
					        } else if (item.conversion_logic_id === ConversionLogics.Product) {
 | 
				
			||||||
          data['count'] = lease_data.reduce((a, b) => a + (item.convertible ? b.count * b.ratio : b.count), 0);
 | 
					          data['total'] = lease_data.reduce((a, b) => a + (item.convertible ? b.count * b.ratio : b.count), 0);
 | 
				
			||||||
        } else if (item.conversion_logic_id === ConversionLogics.ProductWeight) {
 | 
					        } else if (item.conversion_logic_id === ConversionLogics.ProductWeight) {
 | 
				
			||||||
          data['count'] = lease_data.reduce((a, b) => a + b.count * b.weight, 0) / 1000;
 | 
					          data['total'] = lease_data.reduce((a, b) => a + b.count * b.weight, 0) / 1000;
 | 
				
			||||||
        } else if (item.conversion_logic_id === ConversionLogics.ActualWeight) {
 | 
					        } else if (item.conversion_logic_id === ConversionLogics.ActualWeight) {
 | 
				
			||||||
          data['count'] = item.record_weight;
 | 
					          data['total'] = item.record_weight;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
          if (item.weight_rules?.length) {
 | 
					          if (item.weight_rules?.length) {
 | 
				
			||||||
            // 计算有误,需要检查
 | 
					            data['total'] = lease_data.reduce((a, b) => {
 | 
				
			||||||
            data['count'] = lease_data.reduce((a, b) => {
 | 
					 | 
				
			||||||
              const weight_rule = item.weight_rules.find(
 | 
					              const weight_rule = item.weight_rules.find(
 | 
				
			||||||
                (l) => l.product_id === b.product_id || l.product - RulesNumber === b.category_id,
 | 
					                (l) => l.product_id === b.product_id || l.product - RulesNumber === b.category_id,
 | 
				
			||||||
              );
 | 
					              );
 | 
				
			||||||
@ -221,34 +264,15 @@ export class RecordPdfService {
 | 
				
			|||||||
            }, 0);
 | 
					            }, 0);
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // 如果 printSetup === PrintSetup.DisplayAndPrice 要计算费用产生的价格
 | 
					        data['conversion_unit'] = '吨';
 | 
				
			||||||
        if (printSetup === PrintSetup.DisplayAndPrice) {
 | 
					        if (printSetup === PrintSetup.DisplayAndPrice) {
 | 
				
			||||||
          data['total'] = data['count'] * item.unit_price;
 | 
					          data['count'] = data['total'];
 | 
				
			||||||
 | 
					          data['total'] = data['total'] * item.unit_price;
 | 
				
			||||||
 | 
					          data['conversion_unit'] = '元';
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return data;
 | 
					        return data;
 | 
				
			||||||
      })
 | 
					      })
 | 
				
			||||||
      .filter((item) => item && item.count);
 | 
					      .filter((item) => item && item.total);
 | 
				
			||||||
    // 注意把手动录入的加入
 | 
					 | 
				
			||||||
    const manualData = recordData.record_fee_items;
 | 
					 | 
				
			||||||
    // 因为以往逻辑是根据规则查询,这个订单中数据智能单独查询
 | 
					 | 
				
			||||||
    const excludedFee =
 | 
					 | 
				
			||||||
      manualData
 | 
					 | 
				
			||||||
        ?.map((item) => {
 | 
					 | 
				
			||||||
          const data = {
 | 
					 | 
				
			||||||
            isFee: true,
 | 
					 | 
				
			||||||
            name: item.product.custom_name || item.product.label,
 | 
					 | 
				
			||||||
            comment: '',
 | 
					 | 
				
			||||||
            count: item.count,
 | 
					 | 
				
			||||||
            isExcluded: item.is_excluded,
 | 
					 | 
				
			||||||
          };
 | 
					 | 
				
			||||||
          const feeRule = fee_data.find((fee) => fee.fee_product_id === item.product_id);
 | 
					 | 
				
			||||||
          if (feeRule) {
 | 
					 | 
				
			||||||
            data['total'] = feeRule.unit_price * item.count;
 | 
					 | 
				
			||||||
            data['unit'] = '';
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
          return data;
 | 
					 | 
				
			||||||
        })
 | 
					 | 
				
			||||||
        .filter(Boolean) || [];
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const product_fees = transFormProductFee.filter(Boolean);
 | 
					    const product_fees = transFormProductFee.filter(Boolean);
 | 
				
			||||||
    // 内容(租金+费用)
 | 
					    // 内容(租金+费用)
 | 
				
			||||||
@ -280,10 +304,10 @@ export class RecordPdfService {
 | 
				
			|||||||
        product_correlation.push(itemB);
 | 
					        product_correlation.push(itemB);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
    const recordPdfData = [...product_correlation, ...no_product_fee, ...excludedFee];
 | 
					    const recordPdfData = [...product_correlation, ...manualData, ...no_product_fee].filter(Boolean);
 | 
				
			||||||
    return await renderItV2({
 | 
					    return await renderItV2({
 | 
				
			||||||
      detail: recordData,
 | 
					      detail: recordData,
 | 
				
			||||||
      record: recordPdfData, // 租金+费用,无关联费用
 | 
					      record: recordPdfData,
 | 
				
			||||||
      priceRule: make_price,
 | 
					      priceRule: make_price,
 | 
				
			||||||
      isDouble,
 | 
					      isDouble,
 | 
				
			||||||
      printSetup,
 | 
					      printSetup,
 | 
				
			||||||
 | 
				
			|||||||
@ -99,19 +99,6 @@ SELECT
 | 
				
			|||||||
    WHERE
 | 
					    WHERE
 | 
				
			||||||
      r.id = rv.record_id
 | 
					      r.id = rv.record_id
 | 
				
			||||||
  ) AS vehicles,
 | 
					  ) AS vehicles,
 | 
				
			||||||
  (
 | 
					 | 
				
			||||||
    SELECT
 | 
					 | 
				
			||||||
      JSONB_AGG(
 | 
					 | 
				
			||||||
        TO_JSONB(
 | 
					 | 
				
			||||||
          JSONB_SET(TO_JSONB(rfi), '{product}', TO_JSONB(p))
 | 
					 | 
				
			||||||
        )
 | 
					 | 
				
			||||||
      )
 | 
					 | 
				
			||||||
    FROM
 | 
					 | 
				
			||||||
      record_fee_items rfi
 | 
					 | 
				
			||||||
      JOIN product p ON p.id = rfi.product_id
 | 
					 | 
				
			||||||
    WHERE
 | 
					 | 
				
			||||||
      rfi.record_id = r.id
 | 
					 | 
				
			||||||
  ) AS record_fee_items,
 | 
					 | 
				
			||||||
  -- 查询分组实际重量
 | 
					  -- 查询分组实际重量
 | 
				
			||||||
  (
 | 
					  (
 | 
				
			||||||
    SELECT
 | 
					    SELECT
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user