Appearance
采购订单
表行编辑规则
js
{
groupName: "订单明细信息",
groupNameI18nKey: "i18n_field_ItRHVH_ca63399",
groupCode: "purchaseOrderItemList",
groupType: "item",
sortOrder: "2",
extend: {
vxeGridConfig: {
editConfig: {
trigger: "click", // 点击触发编辑
mode: "cell", // 行编辑模式
beforeEditMethod: function (
pageData,
{ row, rowIndex, column, columnIndex },
) {
let formData = pageData.value;
let orderStatus = formData.orderStatus;
let freeze = row.freeze;
let sourceType = row.sourceType;
let mustMaterialNumber = formData.mustMaterialNumber;
if (orderStatus == "7" && column.property == "jit") {
return false;
}
if (
sourceType == "1" &&
(column.property == "price" ||
column.property == "taxCode" ||
column.property == "factory" ||
column.property == "returned")
) {
return false;
}
if (
sourceType == "7" &&
(column.property == "factory" || column.property == "returned")
) {
return false;
}
if (
freeze == "1" &&
(column.property == "taxCode" ||
column.property == "storageLocation" ||
column.property == "factory" ||
column.property == "purchaseType" ||
column.property == "returned")
) {
return false;
}
if (
mustMaterialNumber == "1" &&
(column.property == "materialDesc" ||
column.property == "materialName")
) {
return false;
}
if (
row["deleteOrder"] == "1" &&
(column.property == "requireDate" || column.property == "price")
) {
return false;
}
if (
(row["freeze"] == "1" ||
row["itemStatus"] == "1" ||
row["itemStatus"] == "2" ||
row["itemStatus"] == "4") &&
(column.property == "supplierRemark" ||
column.property == "rejectReason" ||
column.property == "responsibleParty" ||
column.property == "responsibleReason")
) {
return false;
}
let tableData = pageData.value.saleOrderItemList
? pageData.value.saleOrderItemList
: [];
if (tableData.length > 0) {
let filterData = tableData.filter((item) => {
return item.itemNumber === row.orderItemNumber;
});
if (
filterData.length > 0 &&
filterData[0]["rejectReason"] != "2" &&
(column.property == "planDeliveryDate" ||
column.property == "planDeliveryQuantity")
) {
return false;
}
if (
(row["deletePlan"] == "1" ||
row["freeze"] == "1" ||
row["close"] == "1" ||
row["confirmStatus"] != "3") &&
(column.property == "planDeliveryDate" ||
column.property == "planDeliveryQuantity")
) {
return false;
}
}
return true;
},
},
},
},
}对方 ELS 账号 toElsAccount
json
{
"groupCode": "baseForm",
"fieldType": "remoteSelect",
"fieldLabel": "对方ELS账号",
"fieldName": "toElsAccount",
"required": "1"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
if (!data || !data.length) {
return;
}
pageData.toElsAccount = data[0].toElsAccount || "";
pageData.supplierCode = data[0].supplierCode || "";
pageData.supplierName = data[0].supplierName || "";
pageData.isTeamwork = data[0].needCoordination || "";
}js
{
modalColumns: [
{
field: "toElsAccount",
title: "供应商账号",
fieldLabelI18nKey: "i18n_title_supplierAccount",
with: 150,
},
{
field: "supplierName",
title: "供应商名称",
fieldLabelI18nKey: "i18n__RdXRL_8e11f650",
with: 150,
},
{
field: "supplierCode",
title: "供应商编码",
fieldLabelI18nKey: "i18n_field_toCompanyCode",
with: 150,
},
{
field: "needCoordination_dictText",
title: "供应商协同方式",
fieldLabelI18nKey: "i18n_dict_RdXMeCK_5095b760",
with: 150,
},
],
modalUrl: "/supplier/supplierMaster/list",
modalParams: {
frozenFunctionValue: "0",
},
beforeCheckedCallBack(parentRef, pageData, groupData, form) {
return new Promise((resolve, reject) => {
let orderStatus = form.orderStatus || "";
let sourceType = form.sourceType || "";
if (sourceType === "2") {
reject("当前单据来源于采购申请,不能操作");
} else if (orderStatus !== "0") {
reject("只允许操作新建状态单据");
} else {
resolve("success");
}
});
},
mobileHandleBefore(Vue, { _pageData, _form, _cacheAllData, _value }) {
return new Promise((resolve, reject) => {
let orderStatus = _cacheAllData.orderStatus || "";
let sourceType = _cacheAllData.sourceType || "";
if (sourceType === "2") {
reject("当前单据来源于采购申请,不能操作");
} else if (orderStatus !== "0") {
reject("只允许操作新建状态单据");
} else {
resolve("success");
}
});
},
afterClearCallBack: function (form, pageData, col) {
form.toElsAccount = "";
form.supplierCode = "";
form.supplierName = "";
form.isTeamwork = "";
},
}订单状态 orderStatus
json
{
"groupCode": "baseForm",
"fieldType": "select",
"fieldLabel": "订单状态",
"fieldName": "orderStatus",
"dictCode": "srmOrderStatus",
"defaultValue": "0",
"required": "0"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
let flag = !Number(pageData.orderStatus) && !Number(pageData.sourceType);
console.log(
"orderStatus flag",
pageData.orderStatus,
pageData.sourceType,
pageData.orderStatus === "0" && pageData.sourceType === "0",
);
let props = ["purchaseOrg", "toElsAccount", "company"];
props.forEach((key) => setItemDisabled("baseForm", key, !flag));
}公司 company
json
{
"groupCode": "baseForm",
"fieldType": "select",
"fieldLabel": "公司",
"fieldName": "company",
"dictCode": "company",
"defaultValue": "{{companyCode}}",
"required": "1"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
// 本地页面处理复杂绑定函数需求
topEmit && topEmit();
}币别 currency
json
{
"groupCode": "baseForm",
"fieldType": "select",
"fieldLabel": "币别",
"fieldName": "currency",
"dictCode": "srmCurrency",
"defaultValue": "CNY",
"required": "1"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
const http = ctx.appContext.config.globalProperties.$http;
if (value != "" && pageData.chargeCurrency) {
if (value == pageData.chargeCurrency) {
pageData.exchange = "1";
pageData.standardUnit = "1";
} else {
http
.request({
url:
"/exchange/bpExchangeRate/getByOrderData?originalCurrency=" +
value +
"&targetCurrency=" +
pageData.chargeCurrency +
"&orderDate=" +
pageData.orderDate,
method: "get",
})
.then((res) => {
if (res.success && res.result.length > 0) {
pageData.exchange = res.result[0].exchange;
pageData.standardUnit = res.result[0].standardUnit_dictText;
} else {
pageData.exchange = "";
pageData.standardUnit = "";
}
});
}
}
}合同编号 contractNumber
json
{
"groupCode": "baseForm",
"fieldType": "selectModal",
"fieldLabel": "合同编号",
"fieldName": "contractNumber",
"required": "0"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
if (!data || !data.length) {
return;
}
let { contractName = "", contractNumber = "" } = data[0] || {};
pageData.contractName = contractName;
pageData.contractNumber = contractNumber;
}js
{
modalColumns: [
{
field: "contractNumber",
title: "合同编码",
fieldLabelI18nKey: "i18n_field_contractNumber",
with: 150,
},
{
field: "contractName",
title: "合同名称",
fieldLabelI18nKey: "i18n_title_contractNoCode",
with: 150,
},
],
modalUrl: "/contract/purchaseContractHead/list",
modalParams: {
contractStatus: "6",
},
params: ({ pageData, userInfo }) => {
return { contractStatus: "6" };
},
afterClearCallBack: function (form, pageData, col) {
form.contractName = "";
form.contractNumber = "";
},
linkConfig: {
primaryKey: "contractNumber",
actionPath: "/srm/contract/purchase/PurchaseContractHeadListSimple",
bindKey: "contractNumber",
otherQuery: { linkFilter: true },
},
handleBefore: function ({ pageData, linkConfig }) {
if (pageData.tempRole == "sale") {
linkConfig.actionPath = "/srm/contract/sale/SaleContractHeadList";
}
if (pageData.tempRole == "purchase") {
linkConfig.actionPath = "/srm/contract/purchase/PurchaseContractHeadList";
}
return Promise.resolve();
},
}采购方负责人 purchasePrincipal
json
{
"groupCode": "baseForm",
"fieldType": "remoteSelect",
"fieldLabel": "采购方负责人",
"fieldName": "purchasePrincipal",
"required": "1"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
if (!data || !data.length) {
return;
}
let { subAccount = "", realname = "" } = data[0] || {};
pageData.purchasePrincipal = `${subAccount}_${realname}`;
}js
{
modalColumns: [
{
field: "subAccount",
title: "子账号",
fieldLabelI18nKey: "i18n_field_subAccount",
with: 150,
},
{
field: "realname",
title: "姓名",
fieldLabelI18nKey: "i18n_field_realname",
with: 150,
},
],
modalUrl: "/account/elsSubAccount/page",
modalParams: {},
}供方负责人 supplierPrincipal
json
{
"groupCode": "baseForm",
"fieldType": "remoteSelect",
"fieldLabel": "供方负责人",
"fieldName": "supplierPrincipal",
"required": "0"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
if (!data || !data.length) {
return;
}
let { subAccount = "", realname = "" } = data[0] || {};
pageData.supplierPrincipal = `${subAccount}_${realname}`;
}js
{
modalColumns: [
{
field: "subAccount",
title: "子账号",
fieldLabelI18nKey: "i18n_field_subAccount",
with: 150,
},
{
field: "realname",
title: "姓名",
fieldLabelI18nKey: "i18n_field_realname",
with: 150,
},
],
modalUrl: "/account/elsSubAccount/page",
modalParams: {},
}是否需要审批 isAudit
json
{
"groupCode": "baseForm",
"fieldType": "select",
"fieldLabel": "是否需要审批",
"fieldName": "isAudit",
"dictCode": "yn",
"defaultValue": "1",
"required": "1"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
if (!data || !data.length) {
return;
}
setItemDisabled("baseForm", "isSend", value === "0");
}来源类型 sourceType
json
{
"groupCode": "baseForm",
"fieldType": "select",
"fieldLabel": "来源类型",
"fieldName": "sourceType",
"dictCode": "srmOrderSourceType",
"defaultValue": "0",
"required": "0"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
let flag = !Number(pageData.orderStatus) && !Number(pageData.sourceType);
let props = ["purchaseOrg", "toElsAccount", "company"];
props.forEach((key) => setItemDisabled("baseForm", key, !flag));
}物料是否必填 mustMaterialNumber
json
{
"groupCode": "baseForm",
"fieldType": "switch",
"fieldLabel": "物料是否必填",
"fieldName": "mustMaterialNumber",
"dictCode": "yn",
"defaultValue": "1",
"required": "0"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
let flag = value === "1";
let props = ["materialNumber", "materialDesc"];
props.forEach((key) => setItemRequired("baseForm", key, flag));
}附加费用规则 orderCostName
json
{
"groupCode": "baseForm",
"fieldType": "selectModal",
"fieldLabel": "附加费用规则",
"fieldName": "orderCostName",
"required": "0"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
if (data && data.length) {
let orderCostIds = data
.map(function (obj, index) {
return obj.id;
})
.join(",");
let orderCostNames = data
.map(function (obj, index) {
return obj.costType_dictText;
})
.join(",");
pageData.isOrderCost = orderCostIds;
pageData.orderCostName = orderCostNames;
const dataNew = data.map((item, index) => {
const { documentNumber, costType, costType_dictText, taxCode, taxRate } =
item;
return {
itemNumber: `${index + 1}`,
costCode: documentNumber || "",
costType_dictText: costType_dictText || "",
costType: costType || "",
costAmount: "",
costNetAmount: "",
taxCode: taxCode || "",
taxRate: taxRate || "",
};
});
const groups = layoutConfig.groups.filter((group) => {
return group.groupCode === "purchaseOrderCostList" && group.show;
});
if (dataNew.length > 0 && groups.length === 1) {
pageData.purchaseOrderCostList = [...dataNew];
}
}
}js
{
modalColumns: [
{
field: "documentNumber",
title: "费用编码",
fieldLabelI18nKey: "",
with: 150,
},
{
field: "costType_dictText",
title: "费用类型",
fieldLabelI18nKey: "",
with: 150,
},
{
field: "costPlan_dictText",
title: "计费方式",
fieldLabelI18nKey: "",
with: 150,
},
],
modalUrl: "/orderAddCost/purchaseOrderAddCost/list",
modalParams: {},
selectModal: "multiple",
handleAfter: ({ pageData, userInfo }) => {
pageData.isOrderCost = "";
pageData.orderCostName = "";
pageData.purchaseOrderCostList = [];
},
}附加费用规则 isOrderCost
json
{
"groupCode": "baseForm",
"fieldType": "hiddenField",
"fieldLabel": "附加费用规则",
"fieldName": "isOrderCost",
"required": "0"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
if (data && data.length) {
let orderCostIds =
data &&
data
.map(function (obj, index) {
return obj.id;
})
.join(",");
pageData.isOrderCost = orderCostIds;
}
}js
{
modalColumns: [
{
field: "documentNumber",
title: "费用编码",
fieldLabelI18nKey: "",
with: 150,
},
{
field: "costType_dictText",
title: "费用类型",
fieldLabelI18nKey: "",
with: 150,
},
{
field: "costPlan_dictText",
title: "计费方式",
fieldLabelI18nKey: "",
with: 150,
},
{
field: "costPlan_dictText",
title: "计费方式",
fieldLabelI18nKey: "",
with: 150,
},
],
modalUrl: "/orderAddCost/purchaseOrderAddCost/list",
modalParams: {},
selectModel: "multiple",
}是否启用电签 isEsign
json
{
"groupCode": "baseForm",
"fieldType": "select",
"fieldLabel": "是否启用电签",
"fieldName": "isEsign",
"dictCode": "yn",
"defaultValue": "0",
"required": "0"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
topEmit && topEmit();
}要求交期 requireDate 🎉
json
{
"groupCode": "purchaseOrderItemList",
"fieldType": "date",
"title": "要求交期",
"field": "requireDate",
"required": "1"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
let planTableData =
pageData.purchaseOrderDeliveryPlanList || pageData.cacheDeliveryList;
if (!planTableData) return;
let planOrderItemNumber = planTableData.filter(
(item) => item.orderItemNumber === row.itemNumber,
);
if (planOrderItemNumber.length > 1) {
planOrderItemNumber.forEach((rex) => {
if (rex.orderItemNumber == row.itemNumber) {
rex.planDeliveryDate = rex.planDeliveryDate || value;
rex.requireDate = value;
}
});
}
if (planOrderItemNumber.length === 1) {
planOrderItemNumber.forEach((rex) => {
if (rex.orderItemNumber == row.itemNumber) {
rex.planDeliveryDate = rex.planDeliveryDate || value;
rex.requireDate = value;
}
});
}
planOrderItemNumber.forEach((item) => {
const index = pageData.purchaseOrderDeliveryPlanList.findIndex(
(v) => v._X_ROW_KEY == item._X_ROW_KEY,
);
if (index > -1) {
pageData.purchaseOrderDeliveryPlanList.splice(index, 1, item);
}
if (
pageData.purchaseOrderDeliveryPlanList &&
pageData.purchaseOrderDeliveryPlanList.length > 0
) {
const updateIndex = pageData.purchaseOrderDeliveryPlanList.findIndex(
(v) => v._X_ROW_KEY == item._X_ROW_KEY,
);
if (updateIndex > -1 && item.id) {
// 存在且有id
pageData.purchaseOrderDeliveryPlanList.splice(updateIndex, 1, item);
} else {
if (item.id) {
// 不存在但有id
pageData.purchaseOrderDeliveryPlanList.push(item);
}
}
}
});
}数量 quantity 🎉
json
{
"groupCode": "purchaseOrderItemList",
"fieldType": "float",
"title": "数量",
"field": "quantity",
"required": "1"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
if (!Decimal) {
return;
}
// 小数位数
const DIGIT = 4;
const taxRate = row.taxRate || "0";
const formula = Decimal.add(1, Decimal.div(taxRate, 100));
// 含税单价 price;
const price = row.price || "";
// 数量
const quantity = row.quantity || "";
// 计算当前行未税单价 netPrice
if (taxRate && price) {
let netPrice = Decimal.div(price, formula);
// 4位小数
row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
if (quantity) {
const priceUnit = row.priceUnit || "1"; // 价格基数
const countPrice = Decimal.div(price, priceUnit);
let taxAmount = Decimal.mul(countPrice, quantity);
let netAmount = Decimal.div(taxAmount, formula);
row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
}
}
let purchaseOrderItemList = pageData.purchaseOrderItemList || [];
// 汇总计算
let totalTaxAmount = purchaseOrderItemList.reduce((acc, row) => {
return Decimal.add(acc, row.taxAmount || "0");
}, new Decimal(0));
let totalNetAmount = purchaseOrderItemList.reduce((acc, row) => {
return Decimal.add(acc, row.netAmount || "0");
}, new Decimal(0));
pageData.totalTaxAmount = new Decimal(totalTaxAmount).toFixed(DIGIT);
pageData.totalNetAmount = new Decimal(totalNetAmount).toFixed(DIGIT);
if (row.jit == "0") {
// 数量同步到交货计划未交货数量,计划交货数量
let deliveryData = pageData.purchaseOrderDeliveryPlanList;
let notDeliveryQuantityT = deliveryData.reduce((pval, nval) => {
if (row.itemNumber === nval.orderItemNumber) {
pval = Number(pval) + Number(nval.notDeliveryQuantity);
}
return pval;
}, 0);
deliveryData.map((item) => {
if (row.itemNumber === item.orderItemNumber) {
item.planDeliveryQuantity =
notDeliveryQuantityT == row.quantity
? item.planDeliveryQuantity
: row.quantity;
item.notDeliveryQuantity =
notDeliveryQuantityT == row.quantity
? item.notDeliveryQuantity
: row.quantity;
item.quantity = row.quantity;
}
});
pageData.purchaseOrderDeliveryPlanList = deliveryData;
}
// 数量同步更新毛重和净重
if (value) {
const netWeight = Decimal.mul(row.netWeight, value);
const grossWeight = Decimal.mul(row.grossWeight, value);
row.netWeight = new Decimal(netWeight).toFixed(DIGIT);
row.grossWeight = new Decimal(grossWeight).toFixed(DIGIT);
}
}税码 taxCode 🎉
json
{
"groupCode": "purchaseOrderItemList",
"fieldType": "remoteSelect",
"title": "税码",
"field": "taxCode",
"required": "1"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
if (Array.isArray(data) && data.length) {
row.taxCode = data[0].taxCode;
row.taxRate = data[0].taxRate;
}
if (!Decimal) {
return;
}
// 小数位数
const DIGIT = 4;
const taxRate = row.taxRate || "0";
const formula = Decimal.add(1, Decimal.div(taxRate, 100));
// 含税单价 price;
const price = row.price || "";
// 数量
const quantity = row.quantity || "";
// 计算当前行未税单价 netPrice
if (taxRate && price) {
let netPrice = Decimal.div(price, formula);
// 4位小数
row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
if (quantity) {
const priceUnit = row.priceUnit || "1"; // 价格基数
const countPrice = Decimal.div(price, priceUnit);
let taxAmount = Decimal.mul(countPrice, quantity);
let netAmount = Decimal.div(taxAmount, formula);
row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
}
}
let purchaseOrderItemList = pageData.purchaseOrderItemList || [];
// 汇总计算
let totalTaxAmount = purchaseOrderItemList.reduce((acc, row) => {
return Decimal.add(acc, row.taxAmount || "0");
}, new Decimal(0));
let totalNetAmount = purchaseOrderItemList.reduce((acc, row) => {
return Decimal.add(acc, row.netAmount || "0");
}, new Decimal(0));
pageData.totalTaxAmount = new Decimal(totalTaxAmount).toFixed(DIGIT);
pageData.totalNetAmount = new Decimal(totalNetAmount).toFixed(DIGIT);
}js
{
modalColumns: [
{
field: "taxCode",
title: "税码",
fieldLabelI18nKey: "i18n_field_taxCode",
with: 150,
},
{
field: "taxRate",
title: "税率(%)",
fieldLabelI18nKey: "i18n_field_fIW_1d82c0c",
with: 150,
},
{
field: "taxName",
title: "税码名称",
fieldLabelI18nKey: "i18n_field_taxName",
with: 150,
},
{
field: "remark",
title: "备注",
fieldLabelI18nKey: "i18n_field_remark",
with: 150,
},
],
modalUrl: "/base/tax/queryTaxForTemplate",
selectModel: "single",
modalParams(pageData) {
return { purchaseAccount: pageData.toElsAccount };
},
mobileModalParams(Vue, { _pageData, _cacheAllData }) {
return { purchaseAccount: _cacheAllData.toElsAccount };
},
afterRowClearCallBack: function (Vue, row) {
row.taxCode = "";
row.taxRate = "";
},
}价格基数 priceUnit 🎉
json
{
"groupCode": "purchaseOrderItemList",
"fieldType": "input",
"title": "价格基数",
"field": "priceUnit",
"defaultValue": "1",
"required": "0",
"helpText": "单价的整数倍"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
if (!Decimal) {
return;
}
// 小数位数
const DIGIT = 4;
const taxRate = row.taxRate || "0";
const formula = Decimal.add(1, Decimal.div(taxRate, 100));
// 含税单价 price;
const price = row.price || "";
// 数量
const quantity = row.quantity || "";
// 计算当前行未税单价 netPrice
if (taxRate && price) {
let netPrice = Decimal.div(price, formula);
// 4位小数
row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
if (quantity) {
const priceUnit = row.priceUnit || "1"; // 价格基数
const countPrice = Decimal.div(price, priceUnit);
let taxAmount = Decimal.mul(countPrice, quantity);
let netAmount = Decimal.div(taxAmount, formula);
row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
}
}
let purchaseOrderItemList = pageData.purchaseOrderItemList || [];
// 汇总计算
let totalTaxAmount = purchaseOrderItemList.reduce((acc, row) => {
return Decimal.add(acc, row.taxAmount || "0");
}, new Decimal(0));
let totalNetAmount = purchaseOrderItemList.reduce((acc, row) => {
return Decimal.add(acc, row.netAmount || "0");
}, new Decimal(0));
pageData.totalTaxAmount = new Decimal(totalTaxAmount).toFixed(DIGIT);
pageData.totalNetAmount = new Decimal(totalNetAmount).toFixed(DIGIT);
}含税单价 price 🎉
json
{
"groupCode": "purchaseOrderItemList",
"fieldType": "float",
"title": "含税单价",
"field": "price",
"required": "1"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
if (!Decimal) {
return;
}
// 小数位数
const DIGIT = 4;
const taxRate = row.taxRate || "0";
const formula = Decimal.add(1, Decimal.div(taxRate, 100));
// 含税单价 price;
const price = row.price || "";
// 数量
const quantity = row.quantity || "";
// 计算当前行未税单价 netPrice
if (taxRate && price) {
let netPrice = Decimal.div(price, formula);
// 4位小数
row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
if (quantity) {
const priceUnit = row.priceUnit || "1"; // 价格基数
const countPrice = Decimal.div(price, priceUnit);
let taxAmount = Decimal.mul(countPrice, quantity);
let netAmount = Decimal.div(taxAmount, formula);
row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
}
}
let purchaseOrderItemList = pageData.purchaseOrderItemList || [];
// 汇总计算
let totalTaxAmount = purchaseOrderItemList.reduce((acc, row) => {
return Decimal.add(acc, row.taxAmount || "0");
}, new Decimal(0));
let totalNetAmount = purchaseOrderItemList.reduce((acc, row) => {
return Decimal.add(acc, row.netAmount || "0");
}, new Decimal(0));
pageData.totalTaxAmount = new Decimal(totalTaxAmount).toFixed(DIGIT);
pageData.totalNetAmount = new Decimal(totalNetAmount).toFixed(DIGIT);
}交货地址 deliveryAddress 🎉
json
{
"groupCode": "purchaseOrderItemList",
"fieldType": "selectModal",
"title": "交货地址",
"field": "deliveryAddress",
"required": "0"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
if (data && data.length) {
// 填充操作时 _isFill 判断标识值为 true
// 且 data 参数为当前所选行缓存数据
// 如果赋值操作中字段属性不同, 需要加条件判断区分取值
if (_isFill) {
const {
deliveryAddress = "",
receiveContact = "",
receivePhone = "",
} = data[0] || {};
row.deliveryAddress = deliveryAddress;
row.receiveContact = receiveContact;
row.receivePhone = receivePhone;
} else {
const {
address = "",
consignee = "",
purchasePhone = "",
} = data[0] || {};
row.deliveryAddress = address;
row.receiveContact = consignee;
row.receivePhone = purchasePhone;
}
}
}js
{
modalColumns: [
{
field: "address",
title: "收货地址",
fieldLabelI18nKey: "i18n_field_receiveAddress",
with: 150,
},
{
field: "consignee",
title: "收货人",
fieldLabelI18nKey: "i18n_field_consignee",
with: 150,
},
{
field: "purchasePhone",
title: "收货人联系电话",
fieldLabelI18nKey: "i18n_field_receivedPhone",
with: 150,
},
],
modalUrl: "/delivery/deliveryOrderAddress/list",
selectModal: "single",
modalParams: {},
params: {},
// 表行弹窗清除按钮回调
handleAfter: function ({ row }) {
row.deliveryAddress = "";
row.receiveContact = "";
row.receivePhone = "";
},
}退货标识 returned 🎉
json
{
"groupCode": "purchaseOrderItemList",
"fieldType": "select",
"title": "退货标识",
"field": "returned",
"dictCode": "yn",
"defaultValue": "0",
"required": "0",
"helpText": "0:正常交货行、1:退货行,无需后续进行送货安排和收货"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
const deliveryData = pageData.purchaseOrderDeliveryPlanList;
let rData = deliveryData.filter((rs) => row.itemNumber == rs.orderItemNumber);
if (value == "1") {
// 删除
for (let i of rData) {
for (let [j, idx] of deliveryData.entries()) {
if (j.orderItemNumber == i.orderItemNumber) {
deliveryData.splice(idx, 1);
break;
}
}
}
} else {
// 新增
if (rData.length > 0) {
return;
}
const insertTpl = {
requireDate: row.requireDate,
orderItemNumber: row.itemNumber,
planDeliveryDate: row.requireDate,
quantity: row.quantity,
planDeliveryQuantity: row.quantity, //订单数量 = 计划交货数量
originalPlanDeliveryDate: null,
originalPlanDeliveryQuantity: null,
receiveQuantity: 0,
onWayQuantity: 0,
deliveryQuantity: 0,
performanceBaseDate: null,
supplierRemark: null,
purchaseRemark: null,
publishStatus: "0",
confirmStatus: "0",
deletePlan: "0",
close: "0",
freeze: "0",
};
deliveryData.push(insertTpl);
}
}送货安排 jit 🎉
json
{
"groupCode": "purchaseOrderItemList",
"fieldType": "select",
"title": "送货安排",
"field": "jit",
"dictCode": "deliveryArrange",
"defaultValue": "4",
"required": "0",
"helpText": "订单行:供应商基于采购订单行发货; 交货计划:供应商基于交货计划发货,交货计划与订单一同确认; 送货通知:关联采购订单行的交货安排; JIT送货通知:基于采购订单所有可交货数量生成。 为空时默认为“订单行”;送货预约:供应商基于送货预约发货,确认预约才能发货"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
const _jit = value;
let tableData =
pageData.cacheDeliveryList || pageData.purchaseOrderDeliveryPlanList || [];
if (_jit != 0 && _jit != null && tableData && tableData.length) {
var removeData = pageData.cacheDeliveryList.filter(
(item) => row.itemNumber == item.orderItemNumber,
);
tableData = tableData.filter(
(item) => row.itemNumber != item.orderItemNumber,
);
if (pageData.cacheDeliveryList && pageData.cacheDeliveryList.length > 0) {
// 删除缓存交货计划列表对应的orderItemNumber项
removeData.forEach((delData) => {
// 删除的项,如果带了id。则push到列表里
if (delData.id) {
if (pageData.cacheRemoveList) pageData.cacheRemoveList.push(delData);
} else {
const index = pageData.cacheAddList.findIndex(
(v) => v._X_ROW_KEY === delData._X_ROW_KEY,
);
if (index > -1) {
pageData.cacheAddList.splice(index, 1);
}
}
pageData.cacheDeliveryList.forEach((deliver, i) => {
if (delData.orderItemNumber === deliver.orderItemNumber) {
pageData.cacheDeliveryList.splice(i, 1);
}
});
});
}
// _self.$refs['purchaseOrderDeliveryPlanList'].loadData(tableData)
pageData.purchaseOrderDeliveryPlanList = tableData;
}
if (_jit == 0) {
const planRow = tableData.filter(
(item) => row.itemNumber == item.orderItemNumber,
);
console.log("planRow", tableData, planRow);
// jit 为否,对应交付计划没有,则创建一条
if (planRow.length === 0) {
let deliveryPlanItem = {
orderItemNumber: row.itemNumber,
requireDate: row.requireDate, // 要求交期
planDeliveryDate: row.planDeliveryDate || row.requireDate, // 计划交期
quantity: row.quantity, // 订单数量
planDeliveryQuantity: row.quantity, //计划交货数量
originalPlanDeliveryDate: null,
originalPlanDeliveryQuantity: null,
receiveQuantity: 0,
onWayQuantity: 0,
deliveryQuantity: 0,
performanceBaseDate: null,
supplierRemark: null,
purchaseRemark: null,
publishStatus: "0",
confirmStatus: "0",
deletePlan: "0",
close: "0",
freeze: "0",
};
pageData.purchaseOrderDeliveryPlanList &&
pageData.purchaseOrderDeliveryPlanList.push(deliveryPlanItem);
// 新增的,往cache列表push
if (pageData.cacheDeliveryList)
pageData.cacheDeliveryList =
pageData.cacheDeliveryList.concat(deliveryPlanItem);
if (pageData.cacheAddList)
pageData.cacheAddList = pageData.cacheAddList.concat(deliveryPlanItem);
}
}
}进度模板名称 orderProgressTemplateName 🎉
json
{
"groupCode": "purchaseOrderItemList",
"fieldType": "selectModal",
"title": "进度模板名称",
"field": "orderProgressTemplateName",
"required": "0"
}js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void} topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
_isFill,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
},
) {
if (data && data.length) {
// 填充操作时 _isFill 判断标识值为 true
// 且 data 参数为当前所选行缓存数据
// 如果赋值操作中字段属性不同, 需要加条件判断区分取值
if (_isFill) {
const {
orderProgressTemplateNumber = "",
orderProgressTemplateName = "",
orderProgressTemplateId = "",
} = data[0] || {};
row.orderProgressTemplateNumber = orderProgressTemplateNumber;
row.orderProgressTemplateName = orderProgressTemplateName;
row.orderProgressTemplateId = orderProgressTemplateId;
} else {
const {
progressTemplateNumber = "",
progressTemplateName = "",
id = "",
} = data[0] || {};
row.orderProgressTemplateNumber = progressTemplateNumber;
row.orderProgressTemplateName = progressTemplateName;
row.orderProgressTemplateId = id;
}
}
}js
{
modalColumns: [
{
field: "progressTemplateNumber",
title: "进度模板编码",
fieldLabelI18nKey: "",
width: 150,
},
{
field: "progressTemplateName",
title: "进度模板名称",
fieldLabelI18nKey: "",
width: 150,
},
{
field: "applicableScope",
title: "适用范围",
fieldLabelI18nKey: "",
width: 150,
},
],
modalUrl: "/progressTemplate/purchaseOrderProgressHead/list",
selectModal: "single",
params({ pageData, userInfo }) {
return {
progressTemplateStatus: "1",
};
},
modalParams(Vue, form, row) {
return {
progressTemplateStatus: "1",
};
},
mobileModalParams(Vue, { _pageData, _cacheAllData }) {},
handleAfter: function ({ row }) {
row.orderProgressTemplateName = "";
row.orderProgressTemplateNumber = "";
},
}