diff --git a/Antis.Erp.Plat/antis-ncc-admin/src/components/NCC-billSummary/index.vue b/Antis.Erp.Plat/antis-ncc-admin/src/components/NCC-billSummary/index.vue new file mode 100644 index 0000000..5f4734d --- /dev/null +++ b/Antis.Erp.Plat/antis-ncc-admin/src/components/NCC-billSummary/index.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/Antis.Erp.Plat/antis-ncc-admin/src/components/NCC-tableSummaryCell/index.vue b/Antis.Erp.Plat/antis-ncc-admin/src/components/NCC-tableSummaryCell/index.vue new file mode 100644 index 0000000..a15e5ad --- /dev/null +++ b/Antis.Erp.Plat/antis-ncc-admin/src/components/NCC-tableSummaryCell/index.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/Antis.Erp.Plat/antis-ncc-admin/src/components/index.js b/Antis.Erp.Plat/antis-ncc-admin/src/components/index.js index d21e32e..ca8de02 100755 --- a/Antis.Erp.Plat/antis-ncc-admin/src/components/index.js +++ b/Antis.Erp.Plat/antis-ncc-admin/src/components/index.js @@ -8,6 +8,8 @@ import Screenfull from '@/components/Screenfull' import ColumnSettings from '@/components/ColumnSettings' import NCCQuill from '@/components/NCCEditor/quill' import UserSelect from '@/components/NCC-userSelect' +import NCCBillSummary from '@/components/NCC-billSummary' +import NccTableSummaryCell from '@/components/NCC-tableSummaryCell' import uploadBtn from '@/components/NCC-uploadBtn' // 代码生成器专供 import NCCText from '@/components/Generator/components/NCCText' @@ -47,6 +49,8 @@ export default { Vue.component('DepSelect', DepSelect) Vue.component('PosSelect', PosSelect) Vue.component('UserSelect', UserSelect) + Vue.component('NCCBillSummary', NCCBillSummary) + Vue.component('NccTableSummaryCell', NccTableSummaryCell) Vue.component('DicSelect', DicSelect) Vue.component('BillRule', BillRule) Vue.component('NCCInputTable', NCCInputTable) diff --git a/Antis.Erp.Plat/antis-ncc-admin/src/utils/wtComboSkzhDisplay.js b/Antis.Erp.Plat/antis-ncc-admin/src/utils/wtComboSkzhDisplay.js new file mode 100644 index 0000000..8713a1c --- /dev/null +++ b/Antis.Erp.Plat/antis-ncc-admin/src/utils/wtComboSkzhDisplay.js @@ -0,0 +1,113 @@ +import { dynamicText } from '@/filters' + +/** + * 收款账户字典 id → 显示名(全程 String 比较,避免大整数精度导致 == 失败) + * 未匹配时返回空串,便于调用方回退到 skfs 等。 + */ +export function resolveSkzhDictionaryLabel(id, options) { + if (id === null || id === undefined || id === '') return '' + const opts = Array.isArray(options) ? options : [] + const sid = String(id).trim() + if (!sid) return '' + const row = opts.find(o => { + const oid = o.id != null && o.id !== '' ? String(o.id).trim() : '' + const ofid = o.F_Id != null && o.F_Id !== '' ? String(o.F_Id).trim() : '' + return oid === sid || ofid === sid + }) + if (!row) return '' + const name = (row.fullName || row.F_FullName || row.F_mdmc || '').trim() + return name || '' +} + +/** + * 解析 skmx / fkmx:兼容双层 JSON 字符串、单对象非数组。 + * @returns {{ list: Array, rawFallback: string }} + */ +export function parseWtMxJsonArray(val) { + if (val === null || val === undefined || val === '') { + return { list: [], rawFallback: '' } + } + if (Array.isArray(val)) { + return { list: val, rawFallback: '' } + } + if (typeof val === 'object') { + return { list: [val], rawFallback: '' } + } + if (typeof val !== 'string') { + return { list: [], rawFallback: String(val) } + } + const str = val.trim() + if (!str) return { list: [], rawFallback: '' } + try { + let cur = JSON.parse(str) + let guard = 0 + while (typeof cur === 'string' && guard < 4) { + cur = JSON.parse(String(cur).trim()) + guard += 1 + } + if (Array.isArray(cur)) return { list: cur, rawFallback: '' } + if (cur && typeof cur === 'object') return { list: [cur], rawFallback: '' } + return { list: [], rawFallback: str } + } catch (e) { + return { list: [], rawFallback: str } + } +} + +/** + * 列表/详情「收款账户」展示:组合支付时根据 skmx 展开为多段「账户 ¥金额」。 + * skmx 项可含 skzh(账户字典 id)与 skfs(方式名称,兼容旧数据)。 + * + * @param {Object} row - { skzh, skmx } + * @param {Array} skzhOptions - 与 dynamicText 一致的字典选项 + * @returns {string} + */ +export function formatWtSkzhDisplay(row, skzhOptions) { + if (!row || row.skzh === null || row.skzh === undefined || row.skzh === '') return '无' + const options = skzhOptions || [] + if (row.skzh === '组合支付' && (row.skmx || row.fkmx)) { + try { + const { list: skList } = row.skmx ? parseWtMxJsonArray(row.skmx) : { list: [] } + const skParts = Array.isArray(skList) + ? skList.map(item => { + const je = parseFloat(item.skje || item.Skje || 0) + const jeStr = isNaN(je) ? '' : `¥${je.toFixed(2)}` + let name = '' + if (item.skzh != null && item.skzh !== '') { + name = + resolveSkzhDictionaryLabel(item.skzh, options) || + (item.skfs || item.Skfs || '').trim() || + '无' + } else { + name = (item.skfs || item.Skfs || '').trim() || '无' + } + const qtbz = (item.qtbz || item.Qtbz || '').trim() + const extra = qtbz ? `(${qtbz})` : '' + return jeStr ? `${name}${extra} ${jeStr}` : `${name}${extra}` + }) + : [] + let fkParts = [] + if (row.fkmx) { + const { list: fk } = parseWtMxJsonArray(row.fkmx) + if (Array.isArray(fk)) { + fkParts = fk.map(item => { + const lx = (item.lx || item.Lx || '无').trim() + const je = parseFloat(item.je || item.Je || 0) + const jeStr = isNaN(je) ? '' : `¥${je.toFixed(2)}` + return jeStr ? `${lx} ${jeStr}` : lx + }) + } + } + const seg = [] + if (skParts.length) seg.push(`收款:${skParts.join(';')}`) + if (fkParts.length) seg.push(`付款:${fkParts.join(';')}`) + return seg.join('|') || '组合支付' + } catch (e) { + return '组合支付' + } + } + const byDict = resolveSkzhDictionaryLabel(row.skzh, options) + if (byDict) return byDict + const single = dynamicText(row.skzh, options) + if (single && String(single) !== String(row.skzh)) return single + return row.skzh ? String(row.skzh) : '无' +} diff --git a/Antis.Erp.Plat/antis-ncc-admin/src/views/wtBjdbd/index.vue b/Antis.Erp.Plat/antis-ncc-admin/src/views/wtBjdbd/index.vue index aa25622..4de0022 100644 --- a/Antis.Erp.Plat/antis-ncc-admin/src/views/wtBjdbd/index.vue +++ b/Antis.Erp.Plat/antis-ncc-admin/src/views/wtBjdbd/index.vue @@ -195,6 +195,11 @@ + + +