|
|
@@ -0,0 +1,517 @@
|
|
|
+<template>
|
|
|
+ <el-form ref="form" :model="form" :rules="rules">
|
|
|
+ <ele-pro-table
|
|
|
+ ref="table"
|
|
|
+ :needPage="false"
|
|
|
+ :columns="columns"
|
|
|
+ :toolkit="[]"
|
|
|
+ :datasource="form.datasource"
|
|
|
+ cache-key="systemRoleTable17"
|
|
|
+ class="time-form"
|
|
|
+ >
|
|
|
+ <!-- 表头工具栏 -->
|
|
|
+ <template v-slot:toolbar>
|
|
|
+ <div class="headbox">
|
|
|
+ <el-button
|
|
|
+ size="small"
|
|
|
+ type="primary"
|
|
|
+ icon="el-icon-plus"
|
|
|
+ class="ele-btn-icon"
|
|
|
+ @click="handlAdd"
|
|
|
+ >
|
|
|
+ 新增
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template v-slot:productName="{ row, $index }">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + $index + '.productName'"
|
|
|
+ :rules="{
|
|
|
+ required: true,
|
|
|
+ message: '请输入',
|
|
|
+ trigger: 'change'
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <el-input
|
|
|
+ v-model="row.productName"
|
|
|
+ placeholder="请输入"
|
|
|
+ style="width: 60%; margin-right: 10px"
|
|
|
+ :disabled="!!row.productCode"
|
|
|
+ ></el-input>
|
|
|
+ <el-button
|
|
|
+ size="small"
|
|
|
+ type="primary"
|
|
|
+ @click.native="handParent(row, $index)"
|
|
|
+ >选择</el-button
|
|
|
+ >
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+ <template v-slot:productCode="scope">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + scope.$index + '.productCode'"
|
|
|
+ :rules="{
|
|
|
+ required: !!scope.row.productCode ? true : false,
|
|
|
+ message: '请输入',
|
|
|
+ trigger: 'change'
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <el-input v-model="scope.row.productCode" disabled></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+ <template v-slot:productCategoryName="scope">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + scope.$index + '.productCategoryName'"
|
|
|
+ :rules="{
|
|
|
+ required: !!scope.row.productCode ? true : false,
|
|
|
+ message: '请输入',
|
|
|
+ trigger: 'change'
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <el-input v-model="scope.row.productCategoryName" disabled></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+ <template v-slot:totalCount="scope">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + scope.$index + '.totalCount'"
|
|
|
+ :rules="{
|
|
|
+ required: true,
|
|
|
+ pattern: numberReg,
|
|
|
+ message: '请输入数字',
|
|
|
+ trigger: 'blur'
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <el-input
|
|
|
+ v-model="scope.row.totalCount"
|
|
|
+ placeholder="请输入"
|
|
|
+ ></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-slot:productBrand="scope">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + scope.$index + '.productBrand'"
|
|
|
+ >
|
|
|
+ <el-input
|
|
|
+ v-model="scope.row.productBrand"
|
|
|
+ :disabled="!!scope.row.productCode"
|
|
|
+ ></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+ <template v-slot:brand="scope">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + scope.$index + '.brand'"
|
|
|
+ >
|
|
|
+ <el-input v-model="scope.row.brand"></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-slot:modelType="scope">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + scope.$index + '.modelType'"
|
|
|
+ >
|
|
|
+ <el-input
|
|
|
+ v-model="scope.row.modelType"
|
|
|
+ :disabled="!!scope.row.productCode"
|
|
|
+ ></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-slot:specification="scope">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + scope.$index + '.specification'"
|
|
|
+ >
|
|
|
+ <el-input
|
|
|
+ v-model="scope.row.specification"
|
|
|
+ :disabled="!!scope.row.productCode"
|
|
|
+ ></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+ <template v-slot:measuringUnit="scope">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + scope.$index + '.measuringUnit'"
|
|
|
+ >
|
|
|
+ <el-input
|
|
|
+ v-model="scope.row.measuringUnit"
|
|
|
+ placeholder="请输入"
|
|
|
+ disabled
|
|
|
+ ></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+ <template v-slot:remark="scope">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + scope.$index + '.remark'"
|
|
|
+ >
|
|
|
+ <el-input
|
|
|
+ v-model="scope.row.remark"
|
|
|
+ type="textarea"
|
|
|
+ placeholder="请输入"
|
|
|
+ ></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-slot:technicalAnswerName="{ row, $index }">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + $index + '.technicalAnswerName'"
|
|
|
+ :rules="{
|
|
|
+ required: false,
|
|
|
+ message: '请输入',
|
|
|
+ trigger: 'change'
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <el-input
|
|
|
+ v-model="row.technicalAnswerName"
|
|
|
+ placeholder="请输入"
|
|
|
+ @click.native="handHead(row, $index)"
|
|
|
+ ></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+ <template v-slot:technicalParams="scope">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + scope.$index + '.technicalParams'"
|
|
|
+ :rules="{
|
|
|
+ required: false,
|
|
|
+ message: '请输入',
|
|
|
+ trigger: 'change'
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ v-model="scope.row.technicalParams"
|
|
|
+ placeholder="请输入"
|
|
|
+ ></el-input>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+ <template v-slot:files="scope">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + scope.$index + '.files'"
|
|
|
+ >
|
|
|
+ <fileUpload
|
|
|
+ v-model="scope.row.files"
|
|
|
+ module="main"
|
|
|
+ :showLib="false"
|
|
|
+ :limit="5"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+ <template v-slot:expectReceiveDate="scope">
|
|
|
+ <el-form-item
|
|
|
+ style="margin-bottom: 20px"
|
|
|
+ :prop="'datasource.' + scope.$index + '.expectReceiveDate'"
|
|
|
+ :rules="{
|
|
|
+ required: true,
|
|
|
+ message: '请选择日期',
|
|
|
+ trigger: 'blur'
|
|
|
+ }"
|
|
|
+ >
|
|
|
+ <el-date-picker
|
|
|
+ style="width: 100%"
|
|
|
+ clearable
|
|
|
+ v-model="scope.row.expectReceiveDate"
|
|
|
+ type="date"
|
|
|
+ value-format="yyyy-MM-dd"
|
|
|
+ placeholder="请选择日期"
|
|
|
+ >
|
|
|
+ </el-date-picker>
|
|
|
+ </el-form-item>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <!-- 操作列 -->
|
|
|
+ <template v-slot:action="scope">
|
|
|
+ <el-popconfirm
|
|
|
+ class="ele-action"
|
|
|
+ title="确定要删除吗?"
|
|
|
+ @confirm="remove(scope.$index)"
|
|
|
+ >
|
|
|
+ <template v-slot:reference>
|
|
|
+ <el-link type="danger" :underline="false" icon="el-icon-delete">
|
|
|
+ 删除
|
|
|
+ </el-link>
|
|
|
+ </template>
|
|
|
+ </el-popconfirm>
|
|
|
+ </template>
|
|
|
+ </ele-pro-table>
|
|
|
+ <product-list
|
|
|
+ ref="productListRef"
|
|
|
+ :isSole="true"
|
|
|
+ @changeParent="changeParent"
|
|
|
+ ></product-list>
|
|
|
+ <head-list ref="headRef" @changeParent="changeAnswer"></head-list>
|
|
|
+ </el-form>
|
|
|
+</template>
|
|
|
+<script>
|
|
|
+ import { numberReg } from 'ele-admin';
|
|
|
+ import productList from '@/views/bpm/handleTask/components/quotation/product-list.vue';
|
|
|
+ import dictMixins from '@/mixins/dictMixins';
|
|
|
+ import fileUpload from '@/components/upload/fileUpload';
|
|
|
+ import headList from '@/components/headList';
|
|
|
+ export default {
|
|
|
+ mixins: [dictMixins],
|
|
|
+ components: {
|
|
|
+ productList,
|
|
|
+ fileUpload,
|
|
|
+ headList
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ const defaultForm = {
|
|
|
+ key: null,
|
|
|
+ endTime: '',
|
|
|
+ isFirst: 0,
|
|
|
+ name: ''
|
|
|
+ };
|
|
|
+ return {
|
|
|
+ numberReg,
|
|
|
+ defaultForm,
|
|
|
+ form: {
|
|
|
+ datasource: []
|
|
|
+ },
|
|
|
+ rules: {},
|
|
|
+ columns: [
|
|
|
+ {
|
|
|
+ width: 45,
|
|
|
+ type: 'index',
|
|
|
+ columnKey: 'index',
|
|
|
+ align: 'center',
|
|
|
+ fixed: 'left'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ width: 150,
|
|
|
+ prop: 'productCategoryName',
|
|
|
+ label: '分类',
|
|
|
+ slot: 'productCategoryName'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ width: 140,
|
|
|
+ prop: 'productCode',
|
|
|
+ label: '编码',
|
|
|
+ slot: 'productCode'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ width: 240,
|
|
|
+ prop: 'productName',
|
|
|
+ label: '名称',
|
|
|
+ slot: 'productName'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ width: 150,
|
|
|
+ prop: 'productBrand',
|
|
|
+ label: '牌号',
|
|
|
+ slot: 'productBrand'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ width: 80,
|
|
|
+ prop: 'totalCount',
|
|
|
+ label: '数量',
|
|
|
+ slot: 'totalCount'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ width: 100,
|
|
|
+ prop: 'measuringUnit',
|
|
|
+ label: '单位',
|
|
|
+ slot: 'measuringUnit'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ width: 130,
|
|
|
+ prop: 'modelType',
|
|
|
+ label: '型号',
|
|
|
+ slot: 'modelType'
|
|
|
+ },
|
|
|
+
|
|
|
+ {
|
|
|
+ width: 120,
|
|
|
+ prop: 'specification',
|
|
|
+ label: '规格',
|
|
|
+ slot: 'specification'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ width: 130,
|
|
|
+ prop: 'brand',
|
|
|
+ label: '品牌',
|
|
|
+ slot: 'brand'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ width: 170,
|
|
|
+ prop: 'expectReceiveDate',
|
|
|
+ label: '到货日期',
|
|
|
+ slot: 'expectReceiveDate'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ width: 140,
|
|
|
+ prop: 'files',
|
|
|
+ label: '附件',
|
|
|
+ slot: 'files'
|
|
|
+ },
|
|
|
+
|
|
|
+ {
|
|
|
+ width: 220,
|
|
|
+ prop: 'remark',
|
|
|
+ label: '备注',
|
|
|
+ slot: 'remark'
|
|
|
+ },
|
|
|
+ {
|
|
|
+ columnKey: 'action',
|
|
|
+ label: '操作',
|
|
|
+ width: 120,
|
|
|
+ align: 'center',
|
|
|
+ resizable: false,
|
|
|
+ slot: 'action',
|
|
|
+ fixed: 'right',
|
|
|
+ showOverflowTooltip: true
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ };
|
|
|
+ },
|
|
|
+
|
|
|
+ methods: {
|
|
|
+ // 返回列表数据
|
|
|
+ getTableValue() {
|
|
|
+ let comitDatasource = this.form.datasource;
|
|
|
+ if (comitDatasource.length === 0) return [];
|
|
|
+ comitDatasource.forEach((v) => {
|
|
|
+ v.totalPrice = (v.totalCount * v.singlePrice)?.toFixed(2) || 0;
|
|
|
+ v.files = v.files || null;
|
|
|
+ });
|
|
|
+ return comitDatasource;
|
|
|
+ },
|
|
|
+ //修改回显
|
|
|
+ putTableValue(data) {
|
|
|
+ if (data && data?.length) {
|
|
|
+ this.form.datasource = data;
|
|
|
+ }
|
|
|
+ },
|
|
|
+ //选择产品
|
|
|
+ handParent(row, index) {
|
|
|
+ // let item = {
|
|
|
+ // id: row.productCode
|
|
|
+ // };
|
|
|
+ this.$refs.productListRef.open(this.form.datasource, index);
|
|
|
+ },
|
|
|
+ //选择技术人回调
|
|
|
+ changeAnswer(obj, idx) {
|
|
|
+ this.$set(this.form.datasource[idx], 'technicalAnswerId', obj.id);
|
|
|
+ this.$set(this.form.datasource[idx], 'technicalAnswerName', obj.name);
|
|
|
+ },
|
|
|
+ handHead(row, index) {
|
|
|
+ let item = {
|
|
|
+ id: row.technicalAnswerId
|
|
|
+ };
|
|
|
+ this.$refs.headRef.open(item, index);
|
|
|
+ },
|
|
|
+ //选择产品回调
|
|
|
+ changeParent(obj, idx) {
|
|
|
+ // if (
|
|
|
+ // obj.code &&
|
|
|
+ // this.form.datasource
|
|
|
+ // .map((item) => item.productCode)
|
|
|
+ // .includes(obj.code)
|
|
|
+ // ) {
|
|
|
+ // this.$message.warning('不能选择重复的产品');
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ this.$set(this.form.datasource[idx], 'id', obj.id);
|
|
|
+ this.$set(this.form.datasource[idx], 'categoryName', obj.name);
|
|
|
+ this.$set(
|
|
|
+ this.form.datasource[idx],
|
|
|
+ 'productCategoryId',
|
|
|
+ obj.categoryLevelId
|
|
|
+ );
|
|
|
+ this.$set(this.form.datasource[idx], 'productBrand', obj.brandNum);
|
|
|
+ this.$set(
|
|
|
+ this.form.datasource[idx],
|
|
|
+ 'productCategoryName',
|
|
|
+ obj.categoryLevelPath
|
|
|
+ );
|
|
|
+ this.$set(this.form.datasource[idx], 'productCode', obj.code);
|
|
|
+ this.$set(this.form.datasource[idx], 'productName', obj.name);
|
|
|
+ this.$set(this.form.datasource[idx], 'modelType', obj.modelType);
|
|
|
+ this.$set(
|
|
|
+ this.form.datasource[idx],
|
|
|
+ 'measuringUnit',
|
|
|
+ obj.measuringUnit
|
|
|
+ );
|
|
|
+ this.$set(
|
|
|
+ this.form.datasource[idx],
|
|
|
+ 'specification',
|
|
|
+ obj.specification
|
|
|
+ );
|
|
|
+ this.$set(this.form.datasource[idx], 'remark', '');
|
|
|
+ },
|
|
|
+ remove(i) {
|
|
|
+ this.form.datasource.splice(i, 1);
|
|
|
+ this.setSort();
|
|
|
+ },
|
|
|
+ // 清空表格
|
|
|
+ restTable() {
|
|
|
+ this.form.datasource = [];
|
|
|
+ },
|
|
|
+ // 重新排序
|
|
|
+ setSort() {
|
|
|
+ this.form.datasource.forEach((n, index) => {
|
|
|
+ n.key = index + 1;
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 添加
|
|
|
+ handlAdd() {
|
|
|
+ let item = JSON.parse(JSON.stringify(this.defaultForm));
|
|
|
+ item.key = this.form.datasource.length + 1;
|
|
|
+ this.form.datasource.push(item);
|
|
|
+ },
|
|
|
+
|
|
|
+ validateForm(callback) {
|
|
|
+ //开始表单校验
|
|
|
+ this.$refs.form.validate((valid) => {
|
|
|
+ callback(valid);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+</script>
|
|
|
+<style lang="scss" scoped>
|
|
|
+ .headbox {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ .amount {
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: bold;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .time-form .el-form-item {
|
|
|
+ margin-bottom: 0 !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ ::v-deep .period {
|
|
|
+ display: flex;
|
|
|
+ .borderleftnone {
|
|
|
+ .el-input--medium .el-input__inner {
|
|
|
+ border-top-right-radius: 0;
|
|
|
+ border-bottom-right-radius: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .borderrightnone {
|
|
|
+ .el-input--medium .el-input__inner {
|
|
|
+ border-top-left-radius: 0;
|
|
|
+ border-bottom-left-radius: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ::v-deep .time-form tbody > tr:hover > td {
|
|
|
+ background-color: transparent !important;
|
|
|
+ }
|
|
|
+ ::v-deep .time-form .el-table tr {
|
|
|
+ background-color: #ffffff;
|
|
|
+ }
|
|
|
+</style>
|