附件:真假上传

迷南。 2022-09-10 13:19 302阅读 0赞

新增的时候,上传存在前端一个list里面;删除是真删除,直接删除

编辑的时候,删除是假删除,把删除的数据id存在一个list里

watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAcXFfNDAwNTUyMDA_size_20_color_FFFFFF_t_70_g_se_x_16

  1. <template>
  2. <div class="app-add">
  3. <el-form
  4. :model="ruleForm"
  5. :label-position="labelPosition"
  6. :rules="rules"
  7. ref="ruleForm"
  8. label-width="240px"
  9. autocomplete='off'>
  10. <el-form-item label="采购包或标段编号" prop="biddingId">
  11. <el-input v-model.trim="ruleForm.biddingId" placeholder="请输入采购包或标段编号" class="input-text" maxlength="255"/>
  12. </el-form-item>
  13. <el-form-item label="采购包或标段名称" prop="biddingName">
  14. <el-input v-model.trim="ruleForm.biddingName" placeholder="请输入采购包或标段名称" class="input-text" maxlength="255"/>
  15. </el-form-item>
  16. <el-form-item label="采购人名称" prop="purchaseName">
  17. <el-input v-model="ruleForm.purchaseName" placeholder="请输入采购人名称" class="input-text" maxlength="255"/>
  18. </el-form-item>
  19. <el-form-item label="采购人代码" prop="purchaseCode">
  20. <el-input v-model="ruleForm.purchaseCode" placeholder="请输入采购人代码" class="input-text" maxlength="255"/>
  21. </el-form-item>
  22. <el-form-item label="采购人所属的一级中央企业" prop="purchaseParentOrgCode">
  23. <el-input v-model="ruleForm.purchaseParentOrgCode" placeholder="请输入采购人代码所属的一级中央企业" class="input-text"
  24. maxlength="255" disabled/>
  25. </el-form-item>
  26. <el-form-item label="采购人所属主要行业" required>
  27. <el-row :gutter="10">
  28. <el-col :span="9">
  29. <el-form-item prop="firstcode">
  30. <el-select
  31. v-model="ruleForm.firstcode"
  32. placeholder="请选择"
  33. class="select-text"
  34. @change="getType"
  35. style="width:100%"
  36. >
  37. <el-option
  38. v-for="item in industryCodeOption"
  39. :key="item.firstcode"
  40. :label="item.firstname"
  41. :value="item.firstcode"
  42. />
  43. </el-select>
  44. </el-form-item>
  45. </el-col>
  46. <el-col class="line" :span="3"></el-col>
  47. <el-col :span="9">
  48. <el-form-item prop="secondcode">
  49. <el-select
  50. v-model="ruleForm.secondcode"
  51. placeholder="请选择"
  52. class="select-text"
  53. style="width:100%"
  54. value-key="item"
  55. >
  56. <el-option
  57. v-for="item in industrySecondOption"
  58. :key="item.secondcode"
  59. :label="item.secondname"
  60. :value="item.secondcode"
  61. />
  62. </el-select>
  63. </el-form-item>
  64. </el-col>
  65. </el-row>
  66. </el-form-item>
  67. <el-form-item label="采购组织形式" prop="purchaseForm">
  68. <el-radio-group v-model="ruleForm.purchaseForm">
  69. <el-radio :label="1">自主采购</el-radio>
  70. <el-radio :label="2">委托采购</el-radio>
  71. </el-radio-group>
  72. </el-form-item>
  73. <el-form-item label="采购方式" prop="purchaseType">
  74. <el-radio-group v-model="ruleForm.purchaseType">
  75. <el-radio :label="1">公开招标</el-radio>
  76. <el-radio :label="2">邀请招标</el-radio>
  77. <el-radio :label="3">竞争性谈判</el-radio>
  78. <el-radio :label="4">单一来源采购</el-radio>
  79. <el-radio :label="5">询价采购</el-radio>
  80. <el-radio :label="6">其他</el-radio>
  81. </el-radio-group>
  82. </el-form-item>
  83. <el-form-item
  84. prop="singleSourcePurchaserType"
  85. v-if="ruleForm.purchaseType === 4"
  86. :rules="ruleForm.purchaseType === 4 ?
  87. [{ required: true, message: '请选择单一来源采购属性', trigger: 'blur' }]:
  88. [{required: false}]">
  89. <span slot="label">单一来源采购属性
  90. <el-tooltip placement="top">
  91. <div slot="content">采购方式选择“单一来源采购”时,本字段为必填项。</div>
  92. <i class="el-icon-warning" style="color: #0e1B50;"></i>
  93. </el-tooltip>
  94. </span>
  95. <el-radio-group v-model="ruleForm.singleSourcePurchaserType">
  96. <el-radio :label="'1'" @click.native.prevent="singleSourceClick('1')">一般单一来源</el-radio>
  97. <el-radio :label="'2'" @click.native.prevent="singleSourceClick('2')">框架协议执行</el-radio>
  98. <el-radio :label="'3'" @click.native.prevent="singleSourceClick('3')">统谈分签执行</el-radio>
  99. </el-radio-group>
  100. </el-form-item>
  101. <el-form-item label="采购平台" prop="purchasePlatform">
  102. <span slot="label">采购平台
  103. <el-tooltip placement="top">
  104. <div slot="content">如在采购平台采购则填平台全称,如没有在采购平台采购则填无</div>
  105. <i class="el-icon-warning" style="color: #0e1B50;"></i>
  106. </el-tooltip>
  107. </span>
  108. <el-input v-model.trim="ruleForm.purchasePlatform" placeholder="请输入采购平台" class="input-text" maxlength="255"/>
  109. </el-form-item>
  110. <el-form-item label="预算类型" prop="fundType">
  111. <el-radio-group v-model="ruleForm.fundType" @change="clearFundScale">
  112. <el-radio :label="1">有采购包或标段预算</el-radio>
  113. <el-radio :label="2">仅有整体项目预算</el-radio>
  114. <el-radio :label="3">有预估采购规模(标段预计金额)</el-radio>
  115. <el-radio :label="4">无预算</el-radio>
  116. </el-radio-group>
  117. </el-form-item>
  118. <el-form-item
  119. label="采购包或标段预算/规模"
  120. prop="fundScale"
  121. :rules="ruleForm.fundType === 1 ?
  122. [{ required: true, message: '请输入采购包或标段预算金额', trigger: 'blur' },
  123. { pattern: /(^[\-0-9][0-9]*(.[0-9]+)?)$/, message: '请正确输入采购包或标段预算金额', trigger: 'blur' },
  124. { pattern: /^[0-9]+(.?[0-9]{1,2})?$/, message: '最多填写两位小数', trigger: 'blur' }]:
  125. [{ required: true, message: '请输入采购包或标段估算规模金额', trigger: 'blur' },
  126. { pattern: /(^[\-0-9][0-9]*(.[0-9]+)?)$/, message: '请正确输入采购包或标段估算规模金额', trigger: 'blur' },
  127. { pattern: /^[0-9]+(.?[0-9]{1,2})?$/, message: '最多填写两位小数', trigger: 'blur' }]">
  128. <span slot="label">采购包或标段预算/规模
  129. <el-tooltip placement="top">
  130. <div slot="content">填写对应预算类型的采购包或标段预算/规模金额(单位:元),外币转化成人民币。当预算类型选择“有采购包或标段预算”时,填写采购包或标段预算金额;
  131. <br/>当预算类型选择“仅有整体项目预算、有预估采购规模(标段预计金额)、无预算”时,填写采购包或标段估算规模金额。</div>
  132. <i class="el-icon-warning" style="color: #0e1B50;"></i>
  133. </el-tooltip>
  134. </span>
  135. <el-input v-model.trim="ruleForm.fundScale" placeholder="请输入采购包或标段预算/规模" class="input-text-short" maxlength="15"/>
  136. <span></span>
  137. </el-form-item>
  138. <el-form-item label="评标/评价方法" prop="evaluationType">
  139. <el-radio-group v-model="ruleForm.evaluationType" @change="changeData">
  140. <el-radio :label="1">综合评分法</el-radio>
  141. <el-radio :label="2">最低评标价法</el-radio>
  142. <el-radio :label="3">其他</el-radio>
  143. </el-radio-group>
  144. </el-form-item>
  145. <el-form-item
  146. label="技术权重"
  147. prop="technicalWeight"
  148. v-if="ruleForm.purchaseType === 1 || ruleForm.purchaseType === 2"
  149. :rules="ruleForm.purchaseType === 1 || ruleForm.purchaseType === 2 ?
  150. [{ required: true, message: '请输入技术权重', trigger: 'blur' },
  151. { pattern: /(^[\-0-9][0-9]*(.[0-9]+)?)$/, message: '请正确输入技术权重', trigger: 'blur'},
  152. { pattern:/^(([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/, message: '最多填写两位小数',trigger: 'blur' }]:
  153. [{required: false},
  154. { pattern: /(^[\-0-9][0-9]*(.[0-9]+)?)$/, message: '请正确输入技术权重', trigger: 'blur'},
  155. { pattern:/^(([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/, message: '最多填写两位小数',trigger: 'blur' }]">
  156. <span slot="label">技术权重
  157. <el-tooltip placement="top">
  158. <div slot="content">【 】%,小数点后最多保留2位,采购方式选择“公开招标“或”邀请招标“时必填。<br/>技术权重与商务权重相加等于100。</div>
  159. <i class="el-icon-warning" style="color: #0e1B50;"></i>
  160. </el-tooltip>
  161. </span>
  162. <el-input
  163. v-model.trim="ruleForm.technicalWeight"
  164. placeholder="请输入技术权重"
  165. class="input-text-short"
  166. maxlength="255"
  167. />
  168. <span>%</span>
  169. </el-form-item>
  170. <el-form-item
  171. label="商务权重"
  172. prop="businessWeight"
  173. v-if="ruleForm.purchaseType === 1 || ruleForm.purchaseType === 2"
  174. :rules="ruleForm.purchaseType === 1 || ruleForm.purchaseType === 2 ?
  175. [{ required: true, message: '请输入商务权重', trigger: 'blur' },
  176. { pattern: /(^[\-0-9][0-9]*(.[0-9]+)?)$/, message: '请正确输入商务权重', trigger: 'blur'},
  177. { pattern: /^(([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/, message: '最多填写两位小数',trigger: 'blur' }]:
  178. [{required: false},
  179. { pattern: /(^[\-0-9][0-9]*(.[0-9]+)?)$/, message: '请正确输入技术权重', trigger: 'blur'},
  180. { pattern:/^(([1-9]{1}\d*)|(0{1}))(\.\d{1,2})?$/, message: '最多填写两位小数',trigger: 'blur' }]">
  181. <span slot="label">商务权重
  182. <el-tooltip placement="top">
  183. <div slot="content">【 】%,小数点后最多保留2位,采购方式选择“公开招标“、”邀请招标“时必填。商务权重包含价格权重,
  184. <br/>技术权重与商务权重相加等于100。</div>
  185. <i class="el-icon-warning" style="color: #0e1B50;"></i>
  186. </el-tooltip>
  187. </span>
  188. <el-input
  189. v-model.trim="ruleForm.businessWeight"
  190. placeholder="请输入商务权重"
  191. class="input-text-short"
  192. maxlength="255"
  193. />
  194. <span>%</span>
  195. </el-form-item>
  196. <el-form-item
  197. label="发标日期"
  198. prop="biddingDate"
  199. v-if="ruleForm.purchaseType === 1 || ruleForm.purchaseType === 2 || ruleForm.purchaseType === 3 || ruleForm.purchaseType === 5"
  200. :rules="ruleForm.purchaseType === 1 || ruleForm.purchaseType === 2 || ruleForm.purchaseType === 3 || ruleForm.purchaseType === 5?
  201. [{ required: true, message: '请选择公开招标公告、邀请招标公告、竞争性谈判公告、询价采购公告的发布日期', trigger: 'blur' }]:
  202. [{required: false}]">
  203. <span slot="label">发标日期
  204. <el-tooltip placement="top">
  205. <div slot="content">当采购方式为公开招标、邀请招标、竞争性谈判、询
  206. <br/>价采购时,本字段必填。填写公开招标公告、邀请招
  207. <br/>标公告、竞争性谈判公告、询价采购公告的发布日期。</div>
  208. <i class="el-icon-warning" style="color: #0e1B50;"></i>
  209. </el-tooltip>
  210. </span>
  211. <el-date-picker
  212. v-model="ruleForm.biddingDate"
  213. type="date"
  214. value-format="yyyy-MM-dd HH:mm:ss"
  215. format="yyyy-MM-dd"
  216. placeholder="选择日期"
  217. >
  218. </el-date-picker>
  219. </el-form-item>
  220. <el-form-item
  221. label="开标日期"
  222. prop="bidOpeningDate"
  223. v-if="ruleForm.purchaseType === 1 || ruleForm.purchaseType === 2 || ruleForm.purchaseType === 3 || ruleForm.purchaseType === 5"
  224. :rules="ruleForm.purchaseType === 1 || ruleForm.purchaseType === 2 || ruleForm.purchaseType === 3 || ruleForm.purchaseType === 5?
  225. [{ required: true, message: '请选择招标公告、邀请招标公告中确定的开标日期、竞争性谈判公告确定的谈判日期和询价采购公告中确定的报价截止日期。如因特殊原因存在多次开标,则选择最后一次开标日期', trigger: 'blur' }]:
  226. [{required: false}]">
  227. <span slot="label">开标日期
  228. <el-tooltip placement="top">
  229. <div slot="content">当采购方式为公开招标、邀请招标、竞争性谈判、询
  230. <br/>价采购时,本字段必填。填写招标公告、邀请招标公
  231. <br/>告中确定的开标日期、竞争性谈判公告确定的谈判日
  232. <br />期和询价采购公告中确定的报价截止日期。如因特殊
  233. <br />原因存在多次开标,则填写最后一次开标日期。</div>
  234. <i class="el-icon-warning" style="color: #0e1B50;"></i>
  235. </el-tooltip>
  236. </span>
  237. <el-date-picker
  238. v-model="ruleForm.bidOpeningDate"
  239. type="date"
  240. value-format="yyyy-MM-dd HH:mm:ss"
  241. format="yyyy-MM-dd"
  242. placeholder="选择日期"
  243. >
  244. </el-date-picker>
  245. </el-form-item>
  246. <el-form-item label="标段异常状态" prop="biddingState">
  247. <span slot="label">标段异常状态
  248. <el-tooltip placement="top">
  249. <div slot="content">当填报标段存在暂停、流标等情况时必填。</div>
  250. <i class="el-icon-warning" style="color: #0e1B50;"></i>
  251. </el-tooltip>
  252. </span>
  253. <el-radio-group v-model="ruleForm.biddingState" @change="changeData">
  254. <el-radio :label="1" @click.native.prevent="biddingStateClick(1)">暂停(暂时停止,后续有可能继续)</el-radio>
  255. <el-radio :label="2" @click.native.prevent="biddingStateClick(2)">流标(本标段招标终止;如项目继续,重新招标时重新编号)</el-radio>
  256. <el-radio :label="3" @click.native.prevent="biddingStateClick(3)">废标</el-radio>
  257. </el-radio-group>
  258. </el-form-item>
  259. <el-form-item
  260. label="招标文件"
  261. prop="invitationBiddingDocument"
  262. ref="upload-file"
  263. v-if="!oldDataFlag"
  264. :rules="ruleForm.purchaseType === 1 || ruleForm.noFileType === '0'?
  265. [{ required: true, message: '请选择招标文件', trigger: 'blur' }]:
  266. [{required: false}]">
  267. <span>
  268. 非公开发布的线下直签、现货采购、商城采购等少数类产品特性形成的线下直接签署合同的项目可不上传附件,
  269. 系统将自动在采购包或标段编号前增加非招标采购标识。否则招标文件附件必填。
  270. </span>
  271. <el-form-item label="是否线下直签、现货采购、商城采购" prop="noFileType">
  272. <el-radio-group v-model="ruleForm.noFileType">
  273. <el-radio :label="'0'" @click.native.prevent="isLineClick('0')"></el-radio>
  274. <el-radio :label="'1'" @click.native.prevent="isLineClick('1')"></el-radio>
  275. </el-radio-group>
  276. </el-form-item>
  277. <el-upload
  278. class="upload-demo"
  279. action="https://jsonplaceholder.typicode.com/posts/"
  280. multiple
  281. :on-preview="handlePreview"
  282. :on-remove="handleRemove"
  283. :before-remove="beforeRemove"
  284. :auto-upload="false"
  285. :on-change="handleStatus"
  286. :on-exceed="handleExceed"
  287. :show-file-list="false"
  288. :http-request="uploadFile"
  289. accept=".pdf,.doc,.ofd,.docx,.xls,.xlsx,.et,.wps"
  290. :file-list="fileList">
  291. <el-button size="small" type="primary">+点击上传</el-button>
  292. <div slot="tip" class="el-upload__tip"><i>*</i>支持上传招标文件,支持pdf、ofd、doc、docx、xls、xlsx、et、wps格式文件</div>
  293. </el-upload>
  294. <el-table :data="attachments" border style="width: 750px">
  295. <el-table-column type="index" label="序号" width="60" align="center"></el-table-column>
  296. <el-table-column prop="name" label="附件名称" align="center" width="400"></el-table-column>
  297. <el-table-column label="进度" align="center">
  298. <template slot-scope="scope">
  299. <el-progress :percentage="scope.row.percentage"></el-progress>
  300. </template>
  301. </el-table-column>
  302. <el-table-column label="操作" width="130" align="center">
  303. <template slot-scope="scope">
  304. <el-button type="text" size="small" @click="handlePreview(scope.row,2)" v-if="scope.row.name && scope.row.name.substring(scope.row.name.length-3) == 'pdf'">查看</el-button>
  305. <el-button type="text" size="small" @click="handlePreview(scope.row,1)" v-if="scope.row.id">下载</el-button>
  306. <el-button type="text" size="small" @click="handleDel(scope.row,scope.$index)">删除</el-button>
  307. </template>
  308. </el-table-column>
  309. </el-table>
  310. </el-form-item>
  311. <el-form-item
  312. label="招标文件"
  313. prop="invitationBiddingDocument"
  314. ref="upload-file"
  315. v-else>
  316. <span>
  317. 非公开发布的线下直签、现货采购、商城采购等少数类产品特性形成的线下直接签署合同的项目可不上传附件,
  318. 系统将自动在采购包或标段编号前增加非招标采购标识。否则招标文件附件必填。
  319. </span>
  320. <el-form-item label="是否线下直签、现货采购、商城采购" prop="noFileType">
  321. <el-radio-group v-model="ruleForm.noFileType">
  322. <el-radio :label="'0'" @click.native.prevent="isLineClick('0')"></el-radio>
  323. <el-radio :label="'1'" @click.native.prevent="isLineClick('1')"></el-radio>
  324. </el-radio-group>
  325. </el-form-item>
  326. <el-upload
  327. class="upload-demo"
  328. action="https://jsonplaceholder.typicode.com/posts/"
  329. multiple
  330. :on-preview="handlePreview"
  331. :on-remove="handleRemove"
  332. :before-remove="beforeRemove"
  333. :auto-upload="false"
  334. :on-change="handleStatus"
  335. :on-exceed="handleExceed"
  336. :show-file-list="false"
  337. :http-request="uploadFile"
  338. accept=".pdf,.doc,.ofd,.docx,.xls,.xlsx,.et,.wps"
  339. :file-list="fileList">
  340. <el-button size="small" type="primary">+点击上传</el-button>
  341. <div slot="tip" class="el-upload__tip"><i>*</i>支持上传招标文件,支持pdf、ofd、doc、docx、xls、xlsx、et、wps格式文件</div>
  342. </el-upload>
  343. <el-table :data="attachments" border style="width: 750px">
  344. <el-table-column type="index" label="序号" width="60" align="center"></el-table-column>
  345. <el-table-column prop="name" label="附件名称" align="center" width="400"></el-table-column>
  346. <el-table-column label="进度" align="center">
  347. <template slot-scope="scope">
  348. <el-progress :percentage="scope.row.percentage"></el-progress>
  349. </template>
  350. </el-table-column>
  351. <el-table-column label="操作" width="130" align="center">
  352. <template slot-scope="scope">
  353. <el-button type="text" size="small" @click="handlePreview(scope.row,2)" v-if="scope.row.name && scope.row.name.substring(scope.row.name.length-3) == 'pdf'">查看</el-button>
  354. <el-button type="text" size="small" @click="handlePreview(scope.row,1)" v-if="scope.row.id">下载</el-button>
  355. <el-button type="text" size="small" @click="handleDel(scope.row,scope.$index)">删除</el-button>
  356. </template>
  357. </el-table-column>
  358. </el-table>
  359. </el-form-item>
  360. <el-form-item class="detail-btn">
  361. <el-button @click="resetForm('ruleForm')" class="cancelBtn">取消</el-button>
  362. <el-button @click="submitForm('ruleForm')" class="holdBtn">保存</el-button>
  363. </el-form-item>
  364. </el-form>
  365. </div>
  366. </template>
  367. <script>
  368. import "@/assets/styles/tpoms.scss"
  369. import { addData, getDetail, getType, getSecondType, getSelectData, getCompanyInfo } from "@/api/purchase";
  370. import request from '@/utils/request';
  371. import { supplierFile } from "@/api/purchase/index";
  372. export default {
  373. name: "PurchaseAdd",
  374. data() {
  375. // var check = (rule, value, callback) => {
  376. // if (this.attachments.length > 0 && (this.ruleForm.purchaseType !== 1 || this.ruleForm.noFileType !== 0)) {
  377. // callback();
  378. // }else{
  379. // return callback(new Error('请选择上传招标文件'));
  380. // }
  381. // };
  382. return {
  383. id: '',
  384. ruleForm: {
  385. biddingId: "",
  386. biddingName: "",
  387. purchaseName: "",
  388. purchaseCode: "",
  389. purchaseParentOrgCode: "中国中化控股有限责任公司",
  390. industryCode: "",
  391. purchaseForm: 1,
  392. purchaseType: 1,
  393. purchasePlatform: "",
  394. fundScale: "",
  395. evaluationType: 1,
  396. technicalWeight: "",
  397. businessWeight: "",
  398. industryName: "",
  399. firstcode: "",
  400. secondcode: "",
  401. fundType: 1, // 预算类型
  402. singleSourcePurchaserType: '',
  403. biddingDate: '',
  404. bidOpeningDate: '',
  405. biddingState: '',
  406. invitationBiddingDocument: [],
  407. documentDeleteIds: [],
  408. noFileType: ''
  409. },
  410. // 表单校验
  411. rules: {
  412. biddingId: [
  413. { required: true, message: '请输入采购包或标段编号', trigger: 'blur' }
  414. ],
  415. biddingName: [
  416. { required: true, message: '请输入采购包或标段名称', trigger: 'blur' }
  417. ],
  418. purchaseName: [
  419. { required: true, message: '请输入采购人名称', trigger: 'blur' }
  420. ],
  421. purchaseCode: [
  422. { required: true, message: '请输入采购人代码', trigger: 'blur' }
  423. ],
  424. purchaseParentOrgCode: [
  425. { required: true, message: '请输入采购人代码所属的一级中央企业', trigger: 'blur' }
  426. ],
  427. firstcode: [
  428. { required: true, message: '请选择采购人所属主要行业', trigger: 'change' }
  429. ],
  430. secondcode: [
  431. { required: true, message: '请选择采购人所属主要行业', trigger: 'change' }
  432. ],
  433. purchaseForm: [
  434. { required: true, message: '请选择采购组织形式', trigger: 'blur' }
  435. ],
  436. purchaseType: [
  437. { required: true, message: '请选择采购方式', trigger: 'blur' }
  438. ],
  439. purchasePlatform: [
  440. { required: true, message: "请输入采购平台,如在采购平台采购则填平台全称,如没有在采购平台采购则填无", trigger: "blur" }
  441. ],
  442. // fundScale: [
  443. // { required: true, message: "请输入采购包或标段预算/规模", trigger: "blur" },
  444. // { pattern: /(^[\-0-9][0-9]*(.[0-9]+)?)$/, message: "请正确输入采购包或标段预算/规模", trigger: "blur" },
  445. // { pattern: /^[0-9]+(.?[0-9]{1,2})?$/, message: "最多填写两位小数", trigger: "blur" }
  446. // ],
  447. evaluationType: [
  448. { required: true, message: '请选择评标/评价方法', trigger: 'blur' }
  449. ],
  450. fundType: [
  451. { required: true, message: '请选择预算类型', trigger: 'blur' }
  452. ],
  453. // invitationBiddingDocument:[
  454. // { required: true,validator: check, trigger: 'blur' }
  455. // ],
  456. },
  457. labelPosition: 'right',
  458. industryCodeOption: [], // 一级
  459. industrySecondOption: [], // 二级
  460. // 查询参数
  461. queryParams: {
  462. pageNo: 1,
  463. pageNum: 1,
  464. pageSize: 10,
  465. type: 3
  466. },
  467. obj: {},
  468. isChange: false,
  469. // 上传 文件列表
  470. fileList: [],
  471. // 验证 文件 列表
  472. attachments:[],
  473. documentDeleteIds: [],
  474. news: '',
  475. queryParamsEdit: {},
  476. oldDataFlag: false
  477. };
  478. },
  479. watch: {
  480. ruleForm: {
  481. handler: function(nowVal, oldVal) {
  482. for (let key in this.ruleForm) {
  483. if (nowVal[key] != this.obj[key]) {
  484. this.isChange = false
  485. break
  486. } else {
  487. this.isChange = true
  488. }
  489. }
  490. },
  491. deep: true
  492. },
  493. },
  494. created() {
  495. this.id = this.$route.query.id;
  496. this.news = this.$route.query.news;
  497. if(this.news){
  498. this.queryParamsEdit.tableType = this.$route.query.tableType;
  499. }else{
  500. this.queryParamsEdit = JSON.parse(sessionStorage.getItem('Purchase_QUERY_PARAMS'));
  501. }
  502. this.getType();
  503. if (this.id) {
  504. this.getDetail(this.id,this.queryParamsEdit.tableType);
  505. }else{
  506. this.loading = true
  507. getCompanyInfo().then((response) => {
  508. this.ruleForm.purchaseName = response.name;
  509. this.ruleForm.purchaseCode = response.scode;
  510. this.loading = false;
  511. })
  512. this.getSelectData();
  513. }
  514. },
  515. methods: {
  516. /** 详情 */
  517. getDetail(id,tableType) {
  518. this.loading = true
  519. let detail = new Promise((resolve, reject) => {
  520. getDetail(id,tableType).then((response) => {
  521. for(let i = 0; i < response.data.documents.length;i++){
  522. this.attachments = response.data.documents;
  523. //有附件的情况可以让后台返回一下这个字段
  524. this.attachments[i].percentage = 100;
  525. this.attachments[i].name = response.data.documents[i].docname;
  526. }
  527. resolve(response.data)
  528. this.loading = false
  529. })
  530. })
  531. let _this = this
  532. detail.then((function(data) {
  533. _this.ruleForm = data;
  534. _this.oldDataFlag = data.oldDataFlag;
  535. _this.ruleForm.invitationBiddingDocument = _this.attachments;
  536. _this.ruleForm.firstcode = data.firstcode;
  537. _this.ruleForm.purchaseParentOrgCode = "中国中化控股有限责任公司";
  538. let secondcode = data.secondcode;
  539. if (data.technicalWeight == null) {
  540. _this.ruleForm.technicalWeight === '';
  541. }
  542. if (data.businessWeight == null) {
  543. _this.ruleForm.businessWeight === '';
  544. }
  545. let pageSize = 0;
  546. let pageNum = 0;
  547. let secondData = {
  548. firstcode: data.firstcode
  549. }
  550. /** 采购人代码所属主要行业*/
  551. getSecondType(pageSize, pageNum, secondData).then(response => {
  552. _this.industrySecondOption = response.data.list;
  553. for (let i = 0; i < response.data.list.length; i++) {
  554. if (secondcode == response.data.list[i].secondcode) {
  555. _this.ruleForm.secondcode = secondcode
  556. }
  557. }
  558. _this.loading = false
  559. }).catch(res => {
  560. _this.loading = false
  561. })
  562. _this.loading = false
  563. })).catch(res => {
  564. _this.loading = false
  565. })
  566. },
  567. async addMechanism(){
  568. let fileData = new FormData();
  569. this.ruleForm.documentDeleteIds = (this.documentDeleteIds).join(); // 删除id
  570. let _this = this;
  571. if (_this.id) {
  572. _this.ruleForm.id = _this.id;
  573. }
  574. const loading = this.$loading({
  575. lock: true,
  576. text: 'Loading',
  577. spinner: 'el-icon-loading',
  578. background: 'rgba(0, 0, 0, 0.7)'
  579. })
  580. if (this.ruleForm.purchaseType == 1 || this.ruleForm.purchaseType == 2) {
  581. // 技术权重及商务权重之和为100
  582. let technicalWeight = Number(_this.ruleForm.technicalWeight)
  583. let businessWeight = Number(_this.ruleForm.businessWeight)
  584. let sum = technicalWeight + businessWeight
  585. if (sum !== 100) {
  586. _this.msgError('技术权重及商务权重之和为100')
  587. loading.close()
  588. return false
  589. }
  590. }
  591. // if(this.id){
  592. // if(_this.ruleForm.documents.length == 0){
  593. // _this.msgError('请上传招标附件')
  594. // }
  595. // }else{
  596. // if(_this.ruleForm.invitationBiddingDocument.length == 0){
  597. // _this.msgError('请上传招标附件')
  598. // }
  599. // }
  600. _this.ruleForm.industryName = _this.ruleForm.secondcode;
  601. _this.ruleForm.purchaseParentOrgCode = 41;
  602. this.attachments.map((item, index) => {
  603. if (item.raw) fileData.append('file', item.raw);
  604. })
  605. // fileData.append('documentDeleteIds',delData);
  606. fileData.append('params',JSON.stringify(this.ruleForm));
  607. try {
  608. let res = await request.post('/purchaserInfo/save/purchaser', fileData);
  609. if (res.code == 200) {
  610. _this.msgSuccess(res.msg);
  611. loading.close()
  612. // setTimeout(function() {
  613. _this.commonRoute()
  614. // }, 1500)
  615. }
  616. }catch (e) {
  617. loading.close();
  618. _this.ruleForm.purchaseParentOrgCode = "中国中化控股有限责任公司";
  619. }
  620. },
  621. /** 提交和编辑 */
  622. submitForm(formName) {
  623. this.$refs[formName].validate((valid) => {
  624. if (valid) {
  625. if(this.id){
  626. if(this.attachments.length == 0){
  627. // this.msgError('请上传招标附件')
  628. this.commonDialog();
  629. }else{
  630. this.addMechanism();
  631. }
  632. }else{
  633. if(this.ruleForm.invitationBiddingDocument.length == 0){
  634. this.commonDialog();
  635. }else{
  636. this.addMechanism();
  637. }
  638. }
  639. }
  640. });
  641. },
  642. commonDialog(){
  643. this.$confirm('请确认,该采购是否为非公开发布的线下直签、现货采购、商城采购等少数类产品特性形成的线下直接签署合同的项目?', '提示', {
  644. confirmButtonText: '是',
  645. cancelButtonText: '否',
  646. type: 'warning'
  647. }).then(() => {
  648. this.addMechanism();
  649. }).catch(() => {
  650. // this.msgError('请上传招标附件')
  651. });
  652. },
  653. /** 取消 */
  654. resetForm(formName) {
  655. this.$confirm('离开页面,所有修改内容将丢失!', '提示', {
  656. confirmButtonText: '确认离开',
  657. cancelButtonText: '继续编辑',
  658. showClose: false,
  659. callback: action => {
  660. if (action === 'confirm') {
  661. this.commonRoute()
  662. }
  663. }
  664. })
  665. },
  666. /** 公共跳转路由 */
  667. commonRoute() {
  668. let tableType = this.tableType
  669. if (this.news) {
  670. this.$router.go(-1);
  671. } else {
  672. let pageNum = this.pageNum
  673. let pageSize = this.pageSize
  674. this.$router.push({ path: '/purchase/index', query: { tableType, pageNum, pageSize } })
  675. }
  676. },
  677. /**技术权重,商务权重的数据清空 */
  678. changeData() {
  679. this.ruleForm.technicalWeight = ''
  680. this.ruleForm.businessWeight = ''
  681. },
  682. /**解决单选不必填的BUG */
  683. singleSourceClick(number) {
  684. if (this.ruleForm.singleSourcePurchaserType === number) {
  685. this.ruleForm.singleSourcePurchaserType = "";
  686. } else {
  687. this.ruleForm.singleSourcePurchaserType = number;
  688. }
  689. },
  690. isLineClick(number){
  691. if (this.ruleForm.noFileType === number) {
  692. this.ruleForm.noFileType = "";
  693. } else {
  694. this.ruleForm.noFileType = number;
  695. }
  696. },
  697. /**解决单选不必填的BUG */
  698. biddingStateClick(number) {
  699. if (this.ruleForm.biddingState === number) {
  700. this.ruleForm.biddingState = "";
  701. } else {
  702. this.ruleForm.biddingState = number;
  703. }
  704. },
  705. /** 获取采购人代码所属主要行业*/
  706. getType(event) {
  707. this.loading = true
  708. let pageSize = 0
  709. let pageNum = 0
  710. // 二级下拉
  711. if (event !== '' || event !== undefined || event !== null) {
  712. let data = {
  713. firstcode: event
  714. }
  715. getSecondType(pageSize, pageNum, data).then(response => {
  716. this.industrySecondOption = response.data.list
  717. this.ruleForm.secondcode = ''
  718. this.loading = false
  719. })
  720. }
  721. // 一级下拉
  722. if (event == undefined) {
  723. let data = {}
  724. getType(pageSize, pageNum, data).then(response => {
  725. this.industryCodeOption = response.data.list
  726. this.loading = false
  727. })
  728. }
  729. },
  730. /**采购人名称,代码*/
  731. getSelectData() {
  732. getSelectData(this.queryParams).then((response) => {
  733. const { code, data, total } = response
  734. this.total = response.total;
  735. // if(this.id == undefined){
  736. // this.ruleForm.purchaseName = response.name
  737. // this.ruleForm.purchaseCode = response.scode
  738. // }
  739. this.ruleForm.firstcode = response.firstcode
  740. let secondcode = response.secondcode
  741. let pageSize = 0
  742. let pageNum = 0
  743. let secondData = {
  744. firstcode: response.firstcode
  745. }
  746. /** 采购人代码所属主要行业*/
  747. getSecondType(pageSize, pageNum, secondData).then(response => {
  748. this.industrySecondOption = response.data.list
  749. for (let i = 0; i < response.data.list.length; i++) {
  750. if (secondcode == response.data.list[i].secondcode) {
  751. this.ruleForm.secondcode = secondcode
  752. }
  753. }
  754. this.loading = false
  755. })
  756. this.loading = false
  757. })
  758. .catch(function(error) {
  759. this.loading = false
  760. })
  761. },
  762. /** 公共二级下拉框代码*/
  763. commonSecondList() {
  764. /** 采购人代码所属主要行业*/
  765. getSecondType(pageSize, pageNum, secondData).then(response => {
  766. this.industrySecondOption = response.data.list;
  767. for (let i = 0; i < response.data.list.length; i++) {
  768. if (secondcode == response.data.list[i].secondcode) {
  769. this.ruleForm.secondcode = secondcode;
  770. }
  771. }
  772. this.loading = false;
  773. })
  774. },
  775. /** 清空采购包或标段预算/规模*/
  776. clearFundScale(){
  777. this.ruleForm.fundScale = '';
  778. },
  779. /** 浏览 */
  780. handlePreview(row,index) {
  781. //hasOwnProperty方法返回一个布尔值,判断自身属性是否存在,循环的是那个列表
  782. console.log(row,'row')
  783. if(row.hasOwnProperty('raw')){
  784. let pdfUrl = URL.createObjectURL(row.raw)
  785. window.open(pdfUrl);
  786. }else{
  787. supplierFile(row.id,index).then(response => {
  788. window.open(response.msg);
  789. });
  790. }
  791. },
  792. /** 文件必传验证 */
  793. handleStatus(file, fileList){
  794. console.log(file,'file')
  795. // this.$refs.upload.active = true
  796. let patrn = /^[^`!@#$%^&*<>]+$/
  797. if (!patrn.test(file.name)) {// 如果包含特殊字符返回false
  798. this.msgError('文件名称不能有特殊字符');
  799. return false;
  800. }
  801. for(let i = 0; i<this.attachments.length; i++){
  802. if(file.name === this.attachments[i].name){
  803. // this.msgSuccess('替换' + file.name);
  804. this.ruleForm.files = this.attachments[i];
  805. return
  806. }
  807. }
  808. file.percentage = 98;
  809. setTimeout(() => {
  810. file.percentage = 100;
  811. },300)
  812. this.attachments.push(file);
  813. this.ruleForm.invitationBiddingDocument = this.attachments;
  814. },
  815. uploadFile(file){
  816. // console.log(file.file)
  817. },
  818. handleRemove(file, fileList) {
  819. this.attachments = fileList;
  820. },
  821. handleExceed(files, fileList) {
  822. // this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
  823. },
  824. beforeRemove(file, fileList) {
  825. return this.$confirm(`确定移除 ${ file.name }?`);
  826. },
  827. /** 删除附件 */
  828. handleDel(params,index){
  829. if(params.hasOwnProperty('id')){
  830. this.documentDeleteIds.push(params.id)
  831. }
  832. this.attachments.splice(index,1)
  833. this.ruleForm.invitationBiddingDocument = this.attachments;
  834. },
  835. }
  836. }
  837. </script>
  838. <style scoped lang="scss">
  839. .iconStyle{
  840. display: flex;
  841. flex-direction: row;
  842. }
  843. </style>

发表评论

表情:
评论列表 (有 0 条评论,302人围观)

还没有评论,来说两句吧...

相关阅读

    相关 附件真假

    新增的时候,上传存在前端一个list里面;删除是真删除,直接删除 编辑的时候,删除是假删除,把删除的数据id存在一个list里 ![watermark_type_ZHJva

    相关 servlet实现附件

    一、简单介绍 使用 Servlet上传附件 原理上还是蛮简单的,首先获取上传的附件对象,然后做一些简单处理 后写入到指定路径的磁盘中。 二、准备条件 common-io.