电子请购单优化

This commit is contained in:
jhd
2026-06-29 16:48:37 +08:00
parent 6af45432b6
commit afd4165007
2 changed files with 490 additions and 290 deletions

View File

@@ -103,11 +103,16 @@ public class ErpPurchaseRequisitionServiceImpl implements IErpPurchaseRequisitio
if (items == null || items.isEmpty()) { if (items == null || items.isEmpty()) {
return; return;
} }
int seq = 1;
for (ErpPurchaseRequisitionItemBo itemBo : items) { for (ErpPurchaseRequisitionItemBo itemBo : items) {
ErpPurchaseRequisitionItem item = BeanUtil.toBean(itemBo, ErpPurchaseRequisitionItem.class); ErpPurchaseRequisitionItem item = BeanUtil.toBean(itemBo, ErpPurchaseRequisitionItem.class);
item.setItemId(null); item.setItemId(null);
item.setReqId(reqId); item.setReqId(reqId);
if (StringUtils.isBlank(item.getSeq())) {
item.setSeq(String.valueOf(seq));
}
itemMapper.insert(item); itemMapper.insert(item);
seq++;
} }
} }

View File

@@ -41,7 +41,7 @@
<KLPTable v-loading="loading" :data="reqList" @selection-change="handleSelectionChange"> <KLPTable v-loading="loading" :data="reqList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" align="center" prop="reqId" width="70" /> <el-table-column label="序号" align="center" prop="reqId" width="70" v-if="false" />
<el-table-column label="请购部门" align="center" prop="reqDept" width="120" /> <el-table-column label="请购部门" align="center" prop="reqDept" width="120" />
<el-table-column label="品名" align="center" prop="itemName" width="160" :show-overflow-tooltip="true" /> <el-table-column label="品名" align="center" prop="itemName" width="160" :show-overflow-tooltip="true" />
<el-table-column label="规格" align="center" prop="specification" width="140" :show-overflow-tooltip="true" /> <el-table-column label="规格" align="center" prop="specification" width="140" :show-overflow-tooltip="true" />
@@ -70,197 +70,167 @@
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
<!-- 新增/修改 弹窗 --> <!-- 新增/修改 弹窗按纸质单表格排版 -->
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body class="pr-dialog" :close-on-click-modal="false"> <el-dialog :title="title" :visible.sync="open" width="980px" append-to-body class="pr-dialog pf-dialog" :close-on-click-modal="false">
<el-form :model="form" :rules="rules" ref="form" label-width="100px" size="small"> <el-form :model="form" :rules="rules" ref="form" size="small" class="pf-form">
<div class="pr-section">请购信息</div> <!-- 基本信息 -->
<el-row :gutter="16"> <div class="pf-tb">
<el-col :span="8"> <!-- 第1行表头5按纸质单样式 -->
<el-form-item label="请购部门" prop="reqDept"> <div class="pf-tr" style="grid-template-columns:23fr 24fr 26fr 7fr 20fr">
<el-input v-model="form.reqDept" placeholder="请购部门" /> <div class="pf-td pf-lbl">请购部门</div>
</el-form-item> <div class="pf-td pf-lbl"> </div>
</el-col> <div class="pf-td pf-lbl"> </div>
<el-col :span="8"> <div class="pf-td pf-lbl">单位</div>
<el-form-item label="品名" prop="itemName"> <div class="pf-td pf-lbl">请购量</div>
<el-input v-model="form.itemName" placeholder="品名" /> </div>
</el-form-item> <!-- 第2行输入区域 -->
</el-col> <div class="pf-tr" style="grid-template-columns:23fr 24fr 26fr 7fr 20fr">
<el-col :span="8"> <div class="pf-td pf-val"><el-form-item prop="reqDept"><el-input v-model="form.reqDept" size="mini" /></el-form-item></div>
<el-form-item label="规格" prop="specification"> <div class="pf-td pf-val"><el-form-item prop="itemName"><el-input v-model="form.itemName" size="mini" /></el-form-item></div>
<el-input v-model="form.specification" placeholder="规格" /> <div class="pf-td pf-val"><el-form-item prop="specification"><el-input v-model="form.specification" size="mini" /></el-form-item></div>
</el-form-item> <div class="pf-td pf-val"><el-form-item prop="unit"><el-input v-model="form.unit" size="mini" /></el-form-item></div>
</el-col> <div class="pf-td pf-val"><el-form-item prop="quantity"><el-input v-model="form.quantity" size="mini" /></el-form-item></div>
</el-row> </div>
<el-row :gutter="16"> <!-- 第3行用途类别 + 需求日期 -->
<el-col :span="8"> <div class="pf-tr" style="grid-template-columns:23fr 49fr 11fr 17fr">
<el-form-item label="单位" prop="unit"> <div class="pf-td pf-lbl">用途类别</div>
<el-input v-model="form.unit" placeholder="单位" /> <div class="pf-td pf-val pf-chk-group">
</el-form-item> <el-radio-group v-model="form.category" size="mini">
</el-col> <el-radio label="原料物料">原料物料</el-radio>
<el-col :span="8"> <el-radio label="设备增添">设备增添</el-radio>
<el-form-item label="请购量" prop="quantity"> <el-radio label="工程劳务">工程劳务</el-radio>
<el-input v-model="form.quantity" placeholder="请购量" /> <el-radio label="其它用途">其它用途</el-radio>
</el-form-item> </el-radio-group>
</el-col> </div>
<el-col :span="8"> <div class="pf-td pf-lbl">需求日期</div>
<el-form-item label="类别" prop="category"> <div class="pf-td pf-val"><el-form-item prop="requiredDate"><el-input v-model="form.requiredDate" size="mini" /></el-form-item></div>
<el-input v-model="form.category" placeholder="类别" /> </div>
</el-form-item> <!-- 第4行用途说明 + 使用部门 -->
</el-col> <div class="pf-tr" style="grid-template-columns:23fr 49fr 11fr 17fr">
</el-row> <div class="pf-td pf-lbl">用途说明</div>
<el-row :gutter="16"> <div class="pf-td pf-val"><el-form-item prop="purposeDesc"><el-input v-model="form.purposeDesc" size="mini" /></el-form-item></div>
<el-col :span="12"> <div class="pf-td pf-lbl">使用部门</div>
<el-form-item label="需求日期" prop="requiredDate"> <div class="pf-td pf-val"><el-form-item prop="useDept"><el-input v-model="form.useDept" size="mini" /></el-form-item></div>
<el-input v-model="form.requiredDate" placeholder="需求日期" /> </div>
</el-form-item> </div>
</el-col>
<el-col :span="12">
<el-form-item label="使用部门" prop="useDept">
<el-input v-model="form.useDept" placeholder="使用部门" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="用途说明" prop="purposeDesc">
<el-input v-model="form.purposeDesc" type="textarea" :rows="2" placeholder="用途说明" />
</el-form-item>
<div class="pr-section">采购处理</div> <!-- 请购明细 -->
<el-row :gutter="16"> <div class="pf-sec">
<el-col :span="8">
<el-form-item label="品检条件" prop="inspectionCondition">
<el-input v-model="form.inspectionCondition" placeholder="品检条件" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="试用天数" prop="trialDays">
<el-input v-model="form.trialDays" placeholder="试用天数" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="付款条件" prop="paymentTerms">
<el-input v-model="form.paymentTerms" placeholder="付款条件" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="16">
<el-col :span="12">
<el-form-item label="前期采购记录" prop="prevPurchaseRecord">
<el-input v-model="form.prevPurchaseRecord" placeholder="前期采购记录" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="采购金额" prop="totalAmount">
<el-input v-model="form.totalAmount" placeholder="采购金额" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="采购拟办" prop="purchaseProposal">
<el-input v-model="form.purchaseProposal" type="textarea" :rows="2" placeholder="采购拟办" />
</el-form-item>
<div class="pr-section">
请购明细 请购明细
<el-button type="primary" plain size="mini" icon="el-icon-plus" @click="addItem">加行</el-button> <el-button type="primary" plain size="mini" icon="el-icon-plus" @click="addItem">加行</el-button>
<span class="pr-section-hint" v-if="form.items && form.items.length"> {{ form.items.length }} </span> <span class="pf-sec-hint" v-if="form.items && form.items.length"> {{ form.items.length }} </span>
</div> </div>
<el-table :data="form.items" border size="mini" max-height="280" style="margin-bottom:14px"> <el-table :data="form.items" border size="mini" max-height="240" class="pf-it-tb">
<el-table-column label="项次" width="60" align="center"> <el-table-column label="项次" width="60" align="center">
<template slot-scope="s">{{ s.$index + 1 }}</template> <template slot-scope="s">{{ s.$index + 1 }}</template>
</el-table-column> </el-table-column>
<el-table-column label="品名" min-width="130"> <el-table-column label="品名" min-width="130">
<template slot-scope="s"><el-input v-model="s.row.itemName" size="mini" placeholder="品名" /></template> <template slot-scope="s"><el-input v-model="s.row.itemName" size="mini" /></template>
</el-table-column> </el-table-column>
<el-table-column label="规格" min-width="130"> <el-table-column label="规格" min-width="130">
<template slot-scope="s"><el-input v-model="s.row.specification" size="mini" placeholder="规格" /></template> <template slot-scope="s"><el-input v-model="s.row.specification" size="mini" /></template>
</el-table-column> </el-table-column>
<el-table-column label="单位" width="80"> <el-table-column label="单位" width="80" align="center">
<template slot-scope="s"><el-input v-model="s.row.unit" size="mini" placeholder="单位" /></template> <template slot-scope="s"><el-input v-model="s.row.unit" size="mini" /></template>
</el-table-column> </el-table-column>
<el-table-column label="请购量" width="100"> <el-table-column label="请购量" width="100">
<template slot-scope="s"><el-input v-model="s.row.quantity" size="mini" placeholder="请购量" /></template> <template slot-scope="s"><el-input v-model="s.row.quantity" size="mini" /></template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="64" align="center" fixed="right"> <el-table-column label="操作" width="64" align="center" fixed="right">
<template slot-scope="s"> <template slot-scope="s"><i class="el-icon-delete pf-del" @click="removeItem(s.$index)" /></template>
<i class="el-icon-delete pr-del" @click="removeItem(s.$index)" />
</template>
</el-table-column> </el-table-column>
<template slot="empty"><span>加行添加明细</span></template> <template slot="empty"><span>加行添加明细</span></template>
</el-table> </el-table>
<div class="pr-section">审批签名</div> <!-- 采购处理 -->
<el-row :gutter="16"> <div class="pf-tb pf-pt">
<el-col :span="8"> <!-- 品检条件 + 前期采购记录 -->
<el-form-item label="经办(请购)" prop="signRequestHandler"> <div class="pf-tr" style="grid-template-columns:8fr 42fr 17fr 33fr">
<el-input v-model="form.signRequestHandler" placeholder="经办" /> <div class="pf-td pf-lbl">品检条件</div>
</el-form-item> <div class="pf-td pf-val pf-chk-group" style="flex-wrap:wrap">
</el-col> <el-checkbox-group v-model="inspectionChecks" size="mini">
<el-col :span="8"> <el-checkbox label="1">1.一般规格/目视检验</el-checkbox>
<el-form-item label="主任(请购)" prop="signRequestDirector"> <el-checkbox label="2">2.品保检验品</el-checkbox>
<el-input v-model="form.signRequestDirector" placeholder="主任" /> <el-checkbox label="3">3.工程劳务/特殊规格品</el-checkbox>
</el-form-item> <el-checkbox label="4">4.试用</el-checkbox>
</el-col> </el-checkbox-group>
<el-col :span="8"> <span style="margin-left:4px;font-size:12px;color:#606266;white-space:nowrap">
<el-form-item label="厂长(请购)" prop="signRequestFactoryMgr"> 试用 <el-input v-model="form.trialDays" size="mini" style="width:56px;display:inline-block" /> 天后验收
<el-input v-model="form.signRequestFactoryMgr" placeholder="厂长" /> </span>
</el-form-item> </div>
</el-col> <div class="pf-td pf-lbl">前期采购记录</div>
</el-row> <div class="pf-td pf-val"><el-form-item prop="prevPurchaseRecord"><el-input v-model="form.prevPurchaseRecord" size="mini" /></el-form-item></div>
<el-row :gutter="16"> </div>
<el-col :span="8"> <!-- 采购拟办 + 付款条件 -->
<el-form-item label="生产总经理" prop="signRequestGm"> <div class="pf-tr" style="grid-template-columns:10fr 40fr 8fr 42fr">
<el-input v-model="form.signRequestGm" placeholder="生产总经理" /> <div class="pf-td pf-lbl">采购拟办</div>
</el-form-item> <div class="pf-td pf-val"><el-form-item prop="purchaseProposal"><el-input v-model="form.purchaseProposal" size="mini" /></el-form-item></div>
</el-col> <div class="pf-td pf-lbl">付款条件</div>
<el-col :span="8"> <div class="pf-td pf-val"><el-form-item prop="paymentTerms"><el-input v-model="form.paymentTerms" size="mini" /></el-form-item></div>
<el-form-item label="经办(采购)" prop="signPurchaseHandler"> </div>
<el-input v-model="form.signPurchaseHandler" placeholder="经办" /> <!-- 采购金额(人民币) -->
</el-form-item> <div class="pf-tr" style="grid-template-columns:18fr 82fr">
</el-col> <div class="pf-td pf-lbl">采购金额(人民币)</div>
<el-col :span="8"> <div class="pf-td pf-val"><el-form-item prop="totalAmount"><el-input v-model="form.totalAmount" size="mini" /></el-form-item></div>
<el-form-item label="主任(采购)" prop="signPurchaseDirector"> </div>
<el-input v-model="form.signPurchaseDirector" placeholder="主任" /> </div>
</el-form-item>
</el-col> <!-- 审批签名 -->
</el-row> <div class="pf-sec">审批签名</div>
<el-row :gutter="16"> <div class="pf-tb pf-sig">
<el-col :span="8"> <div class="pf-tr" style="grid-template-columns:repeat(8,1fr)">
<el-form-item label="部长/厂长(采购)" prop="signPurchaseManager"> <div class="pf-td pf-lbl" style="grid-column:span 4">采购单位</div>
<el-input v-model="form.signPurchaseManager" placeholder="部长/厂长" /> <div class="pf-td pf-lbl" style="grid-column:span 4">请购单位</div>
</el-form-item> </div>
</el-col> <div class="pf-tr" style="grid-template-columns:repeat(8,1fr)">
<el-col :span="8"> <div class="pf-td pf-lbl" style="grid-column:span 1">董事长</div>
<el-form-item label="董事长(采购)" prop="signPurchaseChairman"> <div class="pf-td pf-lbl" style="grid-column:span 1">部长/厂长</div>
<el-input v-model="form.signPurchaseChairman" placeholder="董事长" /> <div class="pf-td pf-lbl" style="grid-column:span 1">主任</div>
</el-form-item> <div class="pf-td pf-lbl" style="grid-column:span 1">经办</div>
</el-col> <div class="pf-td pf-lbl" style="grid-column:span 1">生产总经理</div>
<el-col :span="8"> <div class="pf-td pf-lbl" style="grid-column:span 1">厂长</div>
<el-form-item label="指定卸货位" prop="unloadLocation"> <div class="pf-td pf-lbl" style="grid-column:span 1">主任</div>
<el-input v-model="form.unloadLocation" placeholder="指定卸货位" /> <div class="pf-td pf-lbl" style="grid-column:span 1">经办</div>
</el-form-item> </div>
</el-col> <div class="pf-tr" style="grid-template-columns:repeat(8,1fr)">
</el-row> <div class="pf-td pf-val" style="grid-column:span 1"><el-form-item prop="signPurchaseChairman"><el-input v-model="form.signPurchaseChairman" size="mini" /></el-form-item></div>
<el-row :gutter="16"> <div class="pf-td pf-val" style="grid-column:span 1"><el-form-item prop="signPurchaseManager"><el-input v-model="form.signPurchaseManager" size="mini" /></el-form-item></div>
<el-col :span="12"> <div class="pf-td pf-val" style="grid-column:span 1"><el-form-item prop="signPurchaseDirector"><el-input v-model="form.signPurchaseDirector" size="mini" /></el-form-item></div>
<el-form-item label="卸货其他位置" prop="unloadOther"> <div class="pf-td pf-val" style="grid-column:span 1"><el-form-item prop="signPurchaseHandler"><el-input v-model="form.signPurchaseHandler" size="mini" /></el-form-item></div>
<el-input v-model="form.unloadOther" placeholder="卸货其他位置" /> <div class="pf-td pf-val" style="grid-column:span 1"><el-form-item prop="signRequestGm"><el-input v-model="form.signRequestGm" size="mini" /></el-form-item></div>
</el-form-item> <div class="pf-td pf-val" style="grid-column:span 1"><el-form-item prop="signRequestFactoryMgr"><el-input v-model="form.signRequestFactoryMgr" size="mini" /></el-form-item></div>
</el-col> <div class="pf-td pf-val" style="grid-column:span 1"><el-form-item prop="signRequestDirector"><el-input v-model="form.signRequestDirector" size="mini" /></el-form-item></div>
<el-col :span="12"> <div class="pf-td pf-val" style="grid-column:span 1"><el-form-item prop="signRequestHandler"><el-input v-model="form.signRequestHandler" size="mini" /></el-form-item></div>
<el-form-item label="状态" prop="formStatus"> </div>
<el-select v-model="form.formStatus" placeholder="状态" style="width:100%"> </div>
<!-- 底部卸货位 -->
<div class="pf-tb">
<div class="pf-tr" style="grid-template-columns:20fr 30fr 8fr 42fr">
<div class="pf-td pf-lbl">物品进厂<br>指定卸货位</div>
<div class="pf-td pf-val"><el-form-item prop="unloadLocation"><el-input v-model="form.unloadLocation" size="mini" /></el-form-item></div>
<div class="pf-td pf-lbl">置于</div>
<div class="pf-td pf-val"><el-form-item prop="unloadOther"><el-input v-model="form.unloadOther" size="mini" placeholder="仓库/其他" /></el-form-item></div>
</div>
</div>
<!-- 状态 + 备注 -->
<div class="pf-tb">
<div class="pf-tr" style="grid-template-columns:8fr 20fr 8fr 64fr">
<div class="pf-td pf-lbl">状态</div>
<div class="pf-td pf-val">
<el-select v-model="form.formStatus" size="mini" style="width:100%">
<el-option label="请购草稿" value="0" /> <el-option label="请购草稿" value="0" />
<el-option label="请购审批中" value="1" /> <el-option label="审批中" value="1" />
<el-option label="请购已通过" value="2" /> <el-option label="已通过" value="2" />
<el-option label="采购处理中" value="3" /> <el-option label="采购处理中" value="3" />
<el-option label="已完成" value="4" /> <el-option label="已完成" value="4" />
<el-option label="已驳回" value="5" /> <el-option label="已驳回" value="5" />
</el-select> </el-select>
</el-form-item> </div>
</el-col> <div class="pf-td pf-lbl"> </div>
</el-row> <div class="pf-td pf-val"><el-form-item prop="remark"><el-input v-model="form.remark" size="mini" /></el-form-item></div>
<el-form-item label="备注" prop="remark"> </div>
<el-input v-model="form.remark" type="textarea" :rows="2" placeholder="备注" /> </div>
</el-form-item>
</el-form> </el-form>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button @click="cancel"> </el-button> <el-button @click="cancel"> </el-button>
@@ -269,83 +239,123 @@
</el-dialog> </el-dialog>
<!-- 查看弹窗 --> <!-- 查看弹窗 -->
<el-dialog title="请购单详情" :visible.sync="viewOpen" width="700px" append-to-body class="pr-dialog"> <el-dialog title="请购单详情" :visible.sync="viewOpen" width="880px" append-to-body class="pr-dialog pr-view-dialog" :close-on-click-modal="false">
<div class="pr-view"> <div class="pr-view">
<div class="pr-view-section">请购信息</div> <div class="pf-tb">
<el-row :gutter="16" class="pr-view-row"> <!-- 第1行表头 -->
<el-col :span="8"><label>请购部门</label><span>{{ viewForm.reqDept || '—' }}</span></el-col> <div class="pf-tr" style="grid-template-columns:23fr 24fr 26fr 7fr 20fr">
<el-col :span="8"><label>品名</label><span>{{ viewForm.itemName || '—' }}</span></el-col> <div class="pf-td pf-lbl">请购部门</div>
<el-col :span="8"><label>规格</label><span>{{ viewForm.specification || '—' }}</span></el-col> <div class="pf-td pf-lbl"> </div>
</el-row> <div class="pf-td pf-lbl"> </div>
<el-row :gutter="16" class="pr-view-row"> <div class="pf-td pf-lbl">单位</div>
<el-col :span="8"><label>单位</label><span>{{ viewForm.unit || '—' }}</span></el-col> <div class="pf-td pf-lbl">请购量</div>
<el-col :span="8"><label>请购量</label><span>{{ viewForm.quantity || '—' }}</span></el-col> </div>
<el-col :span="8"><label>类别</label><span>{{ viewForm.category || '—' }}</span></el-col> <!-- 第2行 -->
</el-row> <div class="pf-tr" style="grid-template-columns:23fr 24fr 26fr 7fr 20fr">
<el-row :gutter="16" class="pr-view-row"> <div class="pf-td pf-val pf-val-read">{{ viewForm.reqDept || '—' }}</div>
<el-col :span="12"><label>需求日期</label><span>{{ viewForm.requiredDate || '—' }}</span></el-col> <div class="pf-td pf-val pf-val-read">{{ viewForm.itemName || '—' }}</div>
<el-col :span="12"><label>使用部门</label><span>{{ viewForm.useDept || '—' }}</span></el-col> <div class="pf-td pf-val pf-val-read">{{ viewForm.specification || '—' }}</div>
</el-row> <div class="pf-td pf-val pf-val-read">{{ viewForm.unit || '—' }}</div>
<el-row class="pr-view-row"> <div class="pf-td pf-val pf-val-read">{{ viewForm.quantity || '—' }}</div>
<el-col><label>用途说明</label><span>{{ viewForm.purposeDesc || '—' }}</span></el-col> </div>
</el-row> <!-- 第3行用途类别 + 需求日期 -->
<div class="pf-tr" style="grid-template-columns:23fr 49fr 11fr 17fr">
<div class="pf-td pf-lbl">用途类别</div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.category || '—' }}</div>
<div class="pf-td pf-lbl">需求日期</div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.requiredDate || '—' }}</div>
</div>
<!-- 第4行用途说明 + 使用部门 -->
<div class="pf-tr" style="grid-template-columns:23fr 49fr 11fr 17fr">
<div class="pf-td pf-lbl">用途说明</div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.purposeDesc || '—' }}</div>
<div class="pf-td pf-lbl">使用部门</div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.useDept || '—' }}</div>
</div>
</div>
<div class="pr-view-section">采购处理</div> <!-- 请购明细 -->
<el-row :gutter="16" class="pr-view-row"> <div class="pv-section-title" style="margin-top:14px">请购明细</div>
<el-col :span="8"><label>品检条件</label><span>{{ viewForm.inspectionCondition || '—' }}</span></el-col> <el-table :data="viewForm.items || []" border size="mini" style="margin-bottom:14px">
<el-col :span="8"><label>试用天数</label><span>{{ viewForm.trialDays || '—' }}</span></el-col>
<el-col :span="8"><label>付款条件</label><span>{{ viewForm.paymentTerms || '—' }}</span></el-col>
</el-row>
<el-row :gutter="16" class="pr-view-row">
<el-col :span="12"><label>前期采购记录</label><span>{{ viewForm.prevPurchaseRecord || '—' }}</span></el-col>
<el-col :span="12"><label>采购金额</label><span>{{ viewForm.totalAmount || '—' }}</span></el-col>
</el-row>
<el-row class="pr-view-row">
<el-col><label>采购拟办</label><span>{{ viewForm.purchaseProposal || '—' }}</span></el-col>
</el-row>
<div class="pr-view-section">请购明细</div>
<el-table :data="viewForm.items || []" border size="mini" max-height="260" style="margin-bottom:14px">
<el-table-column label="项次" width="60" align="center"> <el-table-column label="项次" width="60" align="center">
<template slot-scope="s">{{ s.$index + 1 }}</template> <template slot-scope="s">{{ s.$index + 1 }}</template>
</el-table-column> </el-table-column>
<el-table-column label="品名" prop="itemName" min-width="130" show-overflow-tooltip /> <el-table-column label="品名" prop="itemName" min-width="140" show-overflow-tooltip />
<el-table-column label="规格" prop="specification" min-width="130" show-overflow-tooltip /> <el-table-column label="规格" prop="specification" min-width="140" show-overflow-tooltip />
<el-table-column label="单位" prop="unit" width="80" align="center" /> <el-table-column label="单位" prop="unit" width="80" align="center" />
<el-table-column label="请购量" prop="quantity" width="100" align="right" /> <el-table-column label="请购量" prop="quantity" width="100" align="right" />
<template slot="empty"><span>无明细</span></template> <template slot="empty"><span>无明细</span></template>
</el-table> </el-table>
<div class="pr-view-section">审批签名</div> <!-- 采购处理 -->
<el-row :gutter="16" class="pr-view-row"> <div class="pf-tb pf-pt">
<el-col :span="8"><label>经办(请购)</label><span>{{ viewForm.signRequestHandler || '—' }}</span></el-col> <div class="pf-tr" style="grid-template-columns:8fr 42fr 17fr 33fr">
<el-col :span="8"><label>主任(请购)</label><span>{{ viewForm.signRequestDirector || '—' }}</span></el-col> <div class="pf-td pf-lbl">品检条件</div>
<el-col :span="8"><label>厂长(请购)</label><span>{{ viewForm.signRequestFactoryMgr || '—' }}</span></el-col> <div class="pf-td pf-val pf-val-read" style="text-align:left">{{ formatInsp(viewForm.inspectionCondition, viewForm.trialDays) }}</div>
</el-row> <div class="pf-td pf-lbl">前期采购记录</div>
<el-row :gutter="16" class="pr-view-row"> <div class="pf-td pf-val pf-val-read">{{ viewForm.prevPurchaseRecord || '—' }}</div>
<el-col :span="8"><label>生产总经理</label><span>{{ viewForm.signRequestGm || '—' }}</span></el-col> </div>
<el-col :span="8"><label>经办(采购)</label><span>{{ viewForm.signPurchaseHandler || '—' }}</span></el-col> <div class="pf-tr" style="grid-template-columns:10fr 40fr 8fr 42fr">
<el-col :span="8"><label>主任(采购)</label><span>{{ viewForm.signPurchaseDirector || '—' }}</span></el-col> <div class="pf-td pf-lbl">采购拟办</div>
</el-row> <div class="pf-td pf-val pf-val-read">{{ viewForm.purchaseProposal || '—' }}</div>
<el-row :gutter="16" class="pr-view-row"> <div class="pf-td pf-lbl">付款条件</div>
<el-col :span="8"><label>部长/厂长(采购)</label><span>{{ viewForm.signPurchaseManager || '—' }}</span></el-col> <div class="pf-td pf-val pf-val-read">{{ viewForm.paymentTerms || '—' }}</div>
<el-col :span="8"><label>董事长(采购)</label><span>{{ viewForm.signPurchaseChairman || '—' }}</span></el-col> </div>
<el-col :span="8"><label>指定卸货位</label><span>{{ viewForm.unloadLocation || '—' }}</span></el-col> <div class="pf-tr" style="grid-template-columns:18fr 82fr">
</el-row> <div class="pf-td pf-lbl">采购金额(人民币)</div>
<el-row :gutter="16" class="pr-view-row"> <div class="pf-td pf-val pf-val-read">{{ viewForm.totalAmount || '—' }}</div>
<el-col :span="12"><label>卸货其他位置</label><span>{{ viewForm.unloadOther || '—' }}</span></el-col> </div>
<el-col :span="12"><label>状态</label><span>{{ statusText(viewForm.formStatus) }}</span></el-col> </div>
</el-row>
<el-row class="pr-view-row"> <!-- 审批签名 -->
<el-col><label>备注</label><span>{{ viewForm.remark || '—' }}</span></el-col> <div class="pv-section-title" style="margin-top:14px">审批签名</div>
</el-row> <div class="pf-tb pf-sig">
<div class="pf-tr" style="grid-template-columns:repeat(8,1fr)">
<div class="pf-td pf-lbl" style="grid-column:span 4">采购单位</div>
<div class="pf-td pf-lbl" style="grid-column:span 4">请购单位</div>
</div>
<div class="pf-tr" style="grid-template-columns:repeat(8,1fr)">
<div class="pf-td pf-lbl">董事长</div>
<div class="pf-td pf-lbl">部长/厂长</div>
<div class="pf-td pf-lbl">主任</div>
<div class="pf-td pf-lbl">经办</div>
<div class="pf-td pf-lbl">生产总经理</div>
<div class="pf-td pf-lbl">厂长</div>
<div class="pf-td pf-lbl">主任</div>
<div class="pf-td pf-lbl">经办</div>
</div>
<div class="pf-tr" style="grid-template-columns:repeat(8,1fr)">
<div class="pf-td pf-val pf-val-read">{{ viewForm.signPurchaseChairman || '—' }}</div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.signPurchaseManager || '—' }}</div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.signPurchaseDirector || '—' }}</div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.signPurchaseHandler || '—' }}</div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.signRequestGm || '—' }}</div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.signRequestFactoryMgr || '—' }}</div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.signRequestDirector || '—' }}</div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.signRequestHandler || '—' }}</div>
</div>
</div>
<!-- 底部 -->
<div class="pf-tb" style="margin-top:14px">
<div class="pf-tr" style="grid-template-columns:20fr 30fr 8fr 42fr">
<div class="pf-td pf-lbl">物品进厂<br>指定卸货位</div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.unloadLocation || '—' }}</div>
<div class="pf-td pf-lbl">置于</div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.unloadOther || '—' }}</div>
</div>
<div class="pf-tr" style="grid-template-columns:8fr 20fr 8fr 64fr">
<div class="pf-td pf-lbl">状态</div>
<div class="pf-td pf-val pf-val-read">
<span class="pv-status" :class="'s' + viewForm.formStatus">{{ statusText(viewForm.formStatus) }}</span>
</div>
<div class="pf-td pf-lbl"> </div>
<div class="pf-td pf-val pf-val-read">{{ viewForm.remark || '—' }}</div>
</div>
</div>
</div> </div>
<div slot="footer" class="dialog-footer"> <div slot="footer" class="dialog-footer">
<el-button @click="viewOpen = false"> </el-button> <el-button type="primary" icon="el-icon-download" :loading="printing" @click="exportPdf">导出PDF</el-button>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" plain icon="el-icon-download" :loading="printing" @click="exportPdf">导出PDF</el-button>
<el-button @click="viewOpen = false"> </el-button>
</div> </div>
</el-dialog> </el-dialog>
@@ -357,36 +367,40 @@
<!-- 表1基本信息 --> <!-- 表1基本信息 -->
<table class="pp-tb"> <table class="pp-tb">
<!-- 第1行表头 -->
<tr> <tr>
<td class="pp-lbl" style="width:9%">请购部门</td> <td class="pp-lbl" style="width:23%">请购部门</td>
<td class="pp-val" style="width:12%">{{ printData.reqDept || '' }}</td> <td class="pp-lbl" style="width:25%"> </td>
<td class="pp-lbl" style="width:6%"> </td> <td class="pp-lbl" style="width:24%"> </td>
<td class="pp-val" style="width:15%">{{ printData.itemName || '' }}</td> <td class="pp-lbl" style="width:11%">单位</td>
<td class="pp-lbl" style="width:6%"> </td> <td class="pp-lbl" style="width:17%">请购量</td>
<td class="pp-val" style="width:12%">{{ printData.specification || '' }}</td>
<td class="pp-lbl" style="width:6%">单位</td>
<td class="pp-val" style="width:8%">{{ printData.unit || '' }}</td>
<td class="pp-lbl" style="width:8%">请购量</td>
<td class="pp-val" style="width:10%">{{ printData.quantity || '' }}</td>
<td class="pp-lbl" style="width:6%">用途</td>
<td class="pp-val" style="width:8%">{{ printData.category || '' }}</td>
</tr> </tr>
<!-- 第2行 -->
<tr> <tr>
<td class="pp-lbl"> </td> <td class="pp-val">{{ printData.reqDept || '' }}</td>
<td colspan="11" class="pp-val" style="text-align:left"> <td class="pp-val">{{ printData.itemName || '' }}</td>
<td class="pp-val">{{ printData.specification || '' }}</td>
<td class="pp-val">{{ printData.unit || '' }}</td>
<td class="pp-val">{{ printData.quantity || '' }}</td>
</tr>
<!-- 第3行用途类别 + 需求日期 -->
<tr>
<td class="pp-lbl">用途类别</td>
<td colspan="2" class="pp-val" style="text-align:left;font-size:8.5pt">
<span :class="ppCheck(printData.category === '原料物料')"></span>原料物料 <span :class="ppCheck(printData.category === '原料物料')"></span>原料物料
<span :class="ppCheck(printData.category === '设备增添')"></span>设备增添 <span :class="ppCheck(printData.category === '设备增添')"></span>设备增添
<span :class="ppCheck(printData.category === '工程劳务')"></span>工程劳务 <span :class="ppCheck(printData.category === '工程劳务')"></span>工程劳务
<span :class="ppCheck(printData.category === '其它用途')"></span>其它用途 <span :class="ppCheck(printData.category === '其它用途')"></span>其它用途
</td> </td>
</tr>
<tr>
<td class="pp-lbl">需求日期</td> <td class="pp-lbl">需求日期</td>
<td class="pp-val">{{ printData.requiredDate || '' }}</td> <td class="pp-val">{{ printData.requiredDate || '' }}</td>
<td class="pp-lbl" colspan="1">用途说明</td> </tr>
<td class="pp-val" colspan="5">{{ printData.purposeDesc || '' }}</td> <!-- 第4行用途说明 + 使用部门 -->
<tr>
<td class="pp-lbl">用途说明</td>
<td colspan="2" class="pp-val" style="text-align:left">{{ printData.purposeDesc || '' }}</td>
<td class="pp-lbl">使用部门</td> <td class="pp-lbl">使用部门</td>
<td class="pp-val" colspan="3">{{ printData.useDept || '' }}</td> <td class="pp-val">{{ printData.useDept || '' }}</td>
</tr> </tr>
</table> </table>
@@ -426,28 +440,26 @@
<!-- 表3采购处理 --> <!-- 表3采购处理 -->
<table class="pp-tb"> <table class="pp-tb">
<tr> <tr>
<td class="pp-lbl" style="width:10%">品检条件</td> <td class="pp-lbl" style="width:8%">品检条件</td>
<td colspan="5" class="pp-val" style="text-align:left;font-size:9pt"> <td class="pp-val" style="width:42%;text-align:left;font-size:8.5pt">
<span :class="ppCheck(printData.inspectionCondition && printData.inspectionCondition.includes('一般'))"></span>1.一般规格/目视检验 <span>{{ hasInsp(1) ? '☑' : '□' }}</span>1.一般规格/目视检验
<span :class="ppCheck(printData.inspectionCondition && printData.inspectionCondition.includes('品保'))"></span>2.品保检验品 <span>{{ hasInsp(2) ? '☑' : '□' }}</span>2.品保检验品
<span :class="ppCheck(printData.inspectionCondition && printData.inspectionCondition.includes('工程'))"></span>3.工程劳务/特殊规格品 <span>{{ hasInsp(3) ? '☑' : '□' }}</span>3.工程劳务/特殊规格品
<span :class="ppCheck(printData.inspectionCondition && printData.inspectionCondition.includes('试用'))"></span>4.试用 <span>{{ hasInsp(4) ? '☑' : '□' }}</span>4.试用
{{ printData.trialDays || '____' }} 天后验收 {{ printData.trialDays || '____' }} 天后验收
</td> </td>
</tr> <td class="pp-lbl" style="width:17%">前期采购记录</td>
<tr> <td class="pp-val" style="width:33%">{{ printData.prevPurchaseRecord || '' }}</td>
<td class="pp-lbl">前期采购记录</td>
<td colspan="5" class="pp-val">{{ printData.prevPurchaseRecord || '' }}</td>
</tr> </tr>
<tr> <tr>
<td class="pp-lbl">采购拟办</td> <td class="pp-lbl">采购拟办</td>
<td colspan="5" class="pp-val">{{ printData.purchaseProposal || '' }}</td> <td class="pp-val">{{ printData.purchaseProposal || '' }}</td>
<td class="pp-lbl">付款条件</td>
<td class="pp-val">{{ printData.paymentTerms || '' }}</td>
</tr> </tr>
<tr> <tr>
<td class="pp-lbl">付款条件</td>
<td class="pp-val" colspan="2">{{ printData.paymentTerms || '' }}</td>
<td class="pp-lbl">采购金额(人民币)</td> <td class="pp-lbl">采购金额(人民币)</td>
<td class="pp-val" colspan="2" style="font-size:9pt"> <td class="pp-val" colspan="3" style="text-align:right;padding-right:8px;font-size:9pt">
{{ printData.totalAmount || '' }} {{ printData.totalAmount || '' }}
</td> </td>
</tr> </tr>
@@ -531,6 +543,7 @@ export default {
}, },
form: {}, form: {},
viewForm: {}, viewForm: {},
inspectionChecks: [],
printData: {}, printData: {},
rules: {} rules: {}
} }
@@ -578,6 +591,7 @@ export default {
unloadLocation: '', unloadOther: '', formStatus: '0', remark: '', unloadLocation: '', unloadOther: '', formStatus: '0', remark: '',
items: [] items: []
} }
this.inspectionChecks = []
this.open = true this.open = true
}, },
// 修改 // 修改
@@ -604,6 +618,7 @@ export default {
formStatus: d.formStatus, remark: d.remark, formStatus: d.formStatus, remark: d.remark,
items: d.items || [] items: d.items || []
} }
this.inspectionChecks = d.inspectionCondition ? d.inspectionCondition.split(',').filter(s => s.trim()) : []
this.open = true this.open = true
}).finally(() => { this.buttonLoading = false }) }).finally(() => { this.buttonLoading = false })
}, },
@@ -621,6 +636,7 @@ export default {
submitForm() { submitForm() {
this.$refs['form'].validate(valid => { this.$refs['form'].validate(valid => {
if (!valid) return if (!valid) return
this.form.inspectionCondition = this.inspectionChecks.join(',')
this.buttonLoading = true this.buttonLoading = true
const api = this.form.reqId ? updatePurchaseRequisition : addPurchaseRequisition const api = this.form.reqId ? updatePurchaseRequisition : addPurchaseRequisition
api(this.form).then(() => { api(this.form).then(() => {
@@ -701,9 +717,9 @@ export default {
}, },
// 明细操作 // 明细操作
addItem() { addItem() {
const last = this.form.items[this.form.items.length - 1] const seq = this.form.items.length + 1
this.form.items.push({ this.form.items.push({
itemName: '', specification: '', unit: '', quantity: '' seq: String(seq), itemName: '', specification: '', unit: '', quantity: ''
}) })
}, },
removeItem(index) { removeItem(index) {
@@ -718,7 +734,34 @@ export default {
const map = { '0': 'info', '1': 'warning', '2': 'success', '3': 'warning', '4': 'success', '5': 'danger' } const map = { '0': 'info', '1': 'warning', '2': 'success', '3': 'warning', '4': 'success', '5': 'danger' }
return map[s] || 'info' return map[s] || 'info'
}, },
// PDF 复选框 // 品检条件 — 数字代码 -> 可读描述(查看弹窗用)
formatInsp(val, trialDays) {
if (!val) return '—'
const map = { '1': '1.一般规格/目视检验', '2': '2.品保检验品', '3': '3.工程、劳务/特殊规格品', '4': '4.试用' }
const parts = val.split(',').map(s => s.trim())
// 数字代码格式
if (/^\d+$/.test(parts[0])) {
const labels = parts.map(c => map[c] || c)
if (parts.includes('4') && trialDays) {
const idx = parts.indexOf('4')
labels[idx] = '4.试用 ' + trialDays + ' 天后验收'
}
return labels.join('、')
}
// 旧文本格式直接返回
return val
},
// 品检条件 — 检查是否选中了某个选项(同时兼容数字代码和旧文本格式)
hasInsp(code) {
if (!this.printData.inspectionCondition) return false
const val = this.printData.inspectionCondition
// 数字代码格式 "1,2,4"
if (val.split(',').map(s => s.trim()).includes(String(code))) return true
// 旧文本格式 "一般规格/目视检验,品保检验品" 回退
const keywords = { 1: '一般', 2: '品保', 3: '工程', 4: '试用' }
return val.includes(keywords[code])
},
// PDF 复选框样式
ppCheck(cond) { ppCheck(cond) {
return cond ? 'pp-chk pp-on' : 'pp-chk' return cond ? 'pp-chk pp-on' : 'pp-chk'
} }
@@ -730,14 +773,114 @@ export default {
$accent: #5b8db8; $accent: #5b8db8;
$sub: #909399; $sub: #909399;
.pr-section { .pr-dialog {
::v-deep .el-dialog__body {
padding-top: 10px;
}
}
/* ===== 新增/修改表单 — 纸质单表格排版 ===== */
.pf-dialog {
::v-deep .el-dialog__body {
padding: 14px 16px 6px;
}
::v-deep .el-dialog {
/* 保持980px宽度 */
}
}
.pf-form {
/* form-item 样式委托给 .pf-td.pf-val 处理 */
.el-form-item__error {
position: static;
padding-top: 0;
line-height: 1.2;
}
}
/* 表单表格CSS Grid 版,避免 Vue2 HTML table 组件兼容问题) */
.pf-tb {
width: 100%;
margin-bottom: 8px;
border: 1px solid #dcdfe6;
border-bottom: none;
box-sizing: border-box;
}
.pf-tr {
display: grid;
width: 100%;
}
.pf-td {
border-right: 1px solid #dcdfe6;
border-bottom: 1px solid #dcdfe6;
padding: 3px 5px;
min-height: 28px;
box-sizing: border-box;
display: flex;
align-items: center;
}
.pf-td:last-child {
border-right: none;
}
.pf-td.pf-lbl {
background: #f5f7fa;
font-size: 12px;
color: #606266;
text-align: center;
font-weight: 600;
white-space: nowrap;
justify-content: center;
min-width: 56px;
}
.pf-td.pf-val {
padding: 2px 4px;
.el-form-item {
margin-bottom: 0;
width: 100%;
}
::v-deep .el-form-item__content {
margin-left: 0 !important;
width: 100%;
}
.el-input--mini,
.el-select--mini {
width: 100%;
}
}
.pf-td.pf-chk-group {
text-align: left;
padding: 4px 8px;
flex-wrap: wrap;
.el-checkbox,
.el-radio {
margin-right: 14px;
.el-checkbox__label,
.el-radio__label {
font-size: 12px;
}
}
}
/* 表之间的间距 */
.pf-tb + .pf-tb {
margin-top: -5px;
}
/* 明细 */
.pf-sec {
font-size: 13px; font-size: 13px;
font-weight: 600; font-weight: 600;
color: #303133; color: #303133;
border-left: 3px solid $accent; border-left: 3px solid $accent;
padding-left: 8px; padding-left: 8px;
margin: 16px 0 12px; margin: 14px 0 8px;
.pr-section-hint { .pf-sec-hint {
float: right; float: right;
font-weight: 400; font-weight: 400;
color: $sub; color: $sub;
@@ -745,40 +888,92 @@ $sub: #909399;
} }
} }
.pr-del { .pf-it-tb {
margin-bottom: 12px;
.el-input--mini {
width: 100%;
}
}
/* 采购处理表 — 品检条件行内试用天数 */
.pf-pt .pf-chk-group {
line-height: 26px;
}
/* 签名区 */
.pf-sig .pf-td.pf-lbl {
font-weight: 600;
min-width: 0;
}
/* 删除图标 */
.pf-del {
color: #c45656; color: #c45656;
cursor: pointer; cursor: pointer;
} }
.pr-view-dialog ::v-deep .el-dialog__body {
padding: 16px 20px 6px;
}
/* 查看弹窗卡片式布局 */
.pr-view { .pr-view {
padding: 0 4px; .pv-section {
.pr-view-section { margin-bottom: 16px;
&:last-child { margin-bottom: 0; }
}
.pv-section-title {
font-size: 13px; font-size: 13px;
font-weight: 600; font-weight: 600;
color: #303133; color: $accent;
border-left: 3px solid $accent; padding-bottom: 6px;
padding-left: 8px; margin-bottom: 10px;
margin: 14px 0 10px; border-bottom: 1px solid #ebeef5;
&:first-child { margin-top: 0; }
} }
.pr-view-row { .pv-grid {
margin-bottom: 8px; display: flex;
flex-wrap: wrap;
gap: 0;
}
.pv-item {
width: 33.33%;
padding: 4px 8px 4px 0;
box-sizing: border-box;
display: flex;
align-items: flex-start;
label { label {
display: block;
font-size: 12px; font-size: 12px;
color: $sub; color: $sub;
margin-bottom: 2px; white-space: nowrap;
flex-shrink: 0;
min-width: 72px;
line-height: 22px;
} }
span { span {
font-size: 13px; font-size: 13px;
color: #303133; color: #303133;
line-height: 22px;
word-break: break-all;
}
&.pv-full {
width: 100%;
} }
} }
} .pv-status {
display: inline-block;
.pr-dialog { font-size: 12px;
::v-deep .el-dialog__body { padding: 0 8px;
padding-top: 10px; border-radius: 2px;
line-height: 20px;
border: 1px solid #dcdfe6;
color: $sub;
background: #fafafa;
&.s0 { color: $sub; }
&.s1 { color: #d6a256; border-color: #ecd4a6; background: #fdf6ec; }
&.s2 { color: $accent; border-color: #b9d2e6; background: #eef3f8; }
&.s3 { color: #d6a256; border-color: #ecd4a6; background: #fdf6ec; }
&.s4 { color: $accent; border-color: #b9d2e6; background: #eef3f8; }
&.s5 { color: #c45656; border-color: #e6c4c4; background: #fbf0f0; }
} }
} }