apply.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. <template>
  2. <scTitle v-if="isIframe" class="iframe-detail-title">采购申请信息</scTitle>
  3. <el-form v-loading="loading" :class="['dialog-form', disabled && 'dialog-form-disabled']" ref="dialogForm" :model="form" :rules="rules" :disabled="disabled" label-width="130px">
  4. <el-row :gutter="15">
  5. <el-col :lg="lg" :md="12" :xs="24">
  6. <el-form-item label="采购申请名称:" prop="name">
  7. <el-input v-model="form.name" placeholder="请输入采购申请名称"></el-input>
  8. </el-form-item>
  9. </el-col>
  10. <el-col :lg="lg" :md="12" :xs="24">
  11. <el-form-item label="是否计划内采购:">
  12. <el-radio-group v-model="form.isInPlan" @change="radioChange">
  13. <el-radio label="是" :value="true"></el-radio>
  14. <el-radio label="否" :value="false"></el-radio>
  15. </el-radio-group>
  16. </el-form-item>
  17. </el-col>
  18. <el-col :lg="lg" :md="12" :xs="24">
  19. <el-form-item label="业务所属公司:" prop="belongDeptId">
  20. <tree-select v-model="form.belongDeptId" :apiObj="$API.system.dept" isDept isAllDept check-strictly :disabled="form.id" placeholder="请选择业务所属公司" @change="deptChange"></tree-select>
  21. </el-form-item>
  22. </el-col>
  23. <el-col :lg="lg" :md="12" :xs="24">
  24. <el-form-item label="采购所属项目:" prop="projectId">
  25. <el-select v-model="form.projectId" filterable :disabled="!form.belongDeptId || form.id" placeholder="请选择采购所属项目" @change="projectChange">
  26. <el-option v-for="item in deptProject" :key="item.id" :label="item.projectName" :value="item.id"></el-option>
  27. </el-select>
  28. </el-form-item>
  29. </el-col>
  30. <el-col :lg="lg" :md="12" :xs="24">
  31. <el-form-item label="采购计划引入:">
  32. <sc-table-select v-model="tableSelect.modelValue" :apiObj="tableSelect.apiObj" apiKey="getSelectPage" :params="tableSelect.params" :table-width="840" :props="tableSelect.props" applySql :disabled="!form.projectId || !form.isInPlan || form.id" clearable placeholder="请选择采购计划" placement="bottom" @change="tableSelectChange">
  33. <template #header="{ queryForm, submit: fetchPlan }">
  34. <el-row :gutter="15">
  35. <el-col :md="9" :xs="24">
  36. <el-form-item label="采购计划:" label-width="80px">
  37. <el-input v-model="queryForm.planName" clearable placeholder="请输入采购计划名称" @keyup.enter="fetchPlan" @clear="fetchPlan"></el-input>
  38. </el-form-item>
  39. </el-col>
  40. </el-row>
  41. </template>
  42. <el-table-column label="计划状态" align="center" width="120">已审核<sc-status-indicator type="success"></sc-status-indicator></el-table-column>
  43. <el-table-column label="采购项目名称" prop="planName" align="center" width="200" show-overflow-tooltip></el-table-column>
  44. <el-table-column label="采购所属项目" align="center" width="200" show-overflow-tooltip>
  45. <template #default="scope">{{ formatProjectName(scope.row.projectId) }}</template>
  46. </el-table-column>
  47. <el-table-column label="采购类别" align="center" width="120">
  48. <template #default="scope">{{ formatType(scope.row.type) }}</template>
  49. </el-table-column>
  50. <el-table-column label="合约规划" prop="contractPlanName" align="center" width="200" show-overflow-tooltip></el-table-column>
  51. <el-table-column label="预算金额 (元)" prop="budgetAmount" align="center" width="140"></el-table-column>
  52. <el-table-column label="计划开始日期" prop="beginDate" align="center" width="140"></el-table-column>
  53. <el-table-column label="计划完成日期" prop="endDate" align="center" width="140"></el-table-column>
  54. <el-table-column label="采购公司/部门" align="center" width="200" show-overflow-tooltip>
  55. <template #default="scope">{{ formatDeptName(scope.row.deptId) }}</template>
  56. </el-table-column>
  57. <el-table-column label="业务所属公司" align="center" width="200" show-overflow-tooltip>
  58. <template #default="scope">{{ formatDeptName(scope.row.belongDeptId) }}</template>
  59. </el-table-column>
  60. </sc-table-select>
  61. </el-form-item>
  62. </el-col>
  63. <el-col :lg="lg" :md="12" :xs="24">
  64. <el-form-item label="采购类别:" prop="type">
  65. <dict-select ref="dictSelect" v-model="form.type" dic="procurement_category" filterable placeholder="请选择采购类别" @change="typeChange"></dict-select>
  66. </el-form-item>
  67. </el-col>
  68. <el-col v-if="form.type && !isEngineering" :lg="lg" :md="12" :xs="24">
  69. <el-form-item label="专项费用类型:" prop="specialFeeType">
  70. <dict-select v-model="form.specialFeeType" dic="special_expenses_type" filterable placeholder="请选择专项费用类型"></dict-select>
  71. </el-form-item>
  72. </el-col>
  73. <el-col :lg="lg" :md="12" :xs="24">
  74. <el-form-item label="招采类型:" prop="purchaseType">
  75. <dict-select v-model="form.purchaseType" dic="procurement_type" filterable placeholder="请选择招采类型"></dict-select>
  76. </el-form-item>
  77. </el-col>
  78. <el-col :lg="lg" :md="12" :xs="24">
  79. <el-form-item label="创建人:">
  80. <el-input v-model="form.createName" disabled></el-input>
  81. </el-form-item>
  82. </el-col>
  83. <el-col :lg="lg" :md="12" :xs="24">
  84. <el-form-item label="发起人所属公司:">
  85. <tree-select ref="deptTreeSelect" v-model="form.deptId" :apiObj="$API.system.dept" isDept disabled></tree-select>
  86. </el-form-item>
  87. </el-col>
  88. <el-col :lg="lg" :md="12" :xs="24">
  89. <el-form-item label="资金来源:">
  90. <dict-select v-model="form.fundSource" dic="fund_source" filterable clearable placeholder="请选择资金来源"></dict-select>
  91. </el-form-item>
  92. </el-col>
  93. <el-col :lg="lg" :md="12" :xs="24">
  94. <el-form-item label="预算金额:" prop="budgetAmount">
  95. <el-input-number v-model="form.budgetAmount" :precision="2" :step="0.1" :controls="false" placeholder="请输入预算金额"></el-input-number>
  96. <span class="input-number-suffix">元</span>
  97. </el-form-item>
  98. </el-col>
  99. <el-col :lg="lg" :md="12" :xs="24">
  100. <el-form-item label="是否共用:">
  101. <el-radio-group v-model="form.isShare" disabled>
  102. <el-radio label="是" :value="0"></el-radio>
  103. <el-radio label="否" :value="1"></el-radio>
  104. </el-radio-group>
  105. </el-form-item>
  106. </el-col>
  107. <el-col :lg="lg" :md="12" :xs="24">
  108. <el-form-item label="是否需要成本审批:">
  109. <el-radio-group v-model="form.isCostApprovalRequired">
  110. <el-radio label="是" value="1"></el-radio>
  111. <el-radio label="否" value="0"></el-radio>
  112. </el-radio-group>
  113. </el-form-item>
  114. </el-col>
  115. <el-col :lg="lg" :md="12" :xs="24">
  116. <el-form-item label="外部律师选聘:">
  117. <el-radio-group v-model="form.isLawyer">
  118. <el-radio label="是" :value="1"></el-radio>
  119. <el-radio label="否" :value="0"></el-radio>
  120. </el-radio-group>
  121. </el-form-item>
  122. </el-col>
  123. <el-col v-if="form.isLawyer == 1" :xs="24">
  124. <external-lawyer-selection ref="lawyerSelection" v-model="form.purchaseLaw" :lg="lg" :disabled="disabled"></external-lawyer-selection>
  125. </el-col>
  126. <el-col :xs="24">
  127. <el-form-item label="采购建议:">
  128. <el-input v-model="form.suggestion" type="textarea" :rows="4" placeholder="请输入采购建议"></el-input>
  129. </el-form-item>
  130. </el-col>
  131. <el-col :xs="24">
  132. <el-form-item label="附件上传:">
  133. <sc-upload-file v-model="form.folders['purchase/apply'].entities" :limit="10">
  134. <el-button type="primary" icon="el-icon-upload" size="small"></el-button>
  135. </sc-upload-file>
  136. </el-form-item>
  137. </el-col>
  138. </el-row>
  139. </el-form>
  140. </template>
  141. <script>
  142. import externalLawyerSelection from "./lawyer";
  143. export default {
  144. components: {
  145. externalLawyerSelection
  146. },
  147. props: {
  148. id: { type: String, default: "" },
  149. lg: { type: Number, default: 8 },
  150. disabled: { type: Boolean, default: false },
  151. isIframe: { type: Boolean, default: false }
  152. },
  153. data() {
  154. return {
  155. loading: false,
  156. isSaveing: false,
  157. updateFolder: !this.disabled,
  158. projects: [],
  159. tableSelect: {
  160. apiObj: this.$API.procurement.plan,
  161. params: { status: "done" },
  162. props: { label: "planName" },
  163. modelValue: null
  164. },
  165. form: {
  166. id: null,
  167. planId: null,
  168. planName: null,
  169. name: null,
  170. deptId: this.$TOOL.data.get("USER_INFO").deptId,
  171. belongDeptId: null,
  172. type: null,
  173. specialFeeType: null,
  174. purchaseType: null,
  175. isInPlan: true,
  176. createId: this.$TOOL.data.get("USER_INFO").id,
  177. createName: this.$TOOL.data.get("USER_INFO").nickName,
  178. budgetAmount: null,
  179. fundSource: null,
  180. projectId: null,
  181. projectNo: null,
  182. isShare: 1,
  183. isCostApprovalRequired: "0",
  184. isLawyer: 0,
  185. suggestion: null,
  186. status: null,
  187. folders: {
  188. "purchase/apply": {
  189. entities: []
  190. }
  191. },
  192. purchaseLaw: null
  193. },
  194. rules: {
  195. projectId: [{ required: true, message: "请选择采购所属项目" }],
  196. name: [{ required: true, message: "请输入采购申请名称" }],
  197. belongDeptId: [{ required: true, message: "请选择业务所属公司" }],
  198. type: [{ required: true, message: "请选择采购类别" }],
  199. specialFeeType: [{ required: true, message: "请选择专项费用类型" }],
  200. purchaseType: [{ required: true, message: "请选择招采类型" }],
  201. budgetAmount: [{ required: true, message: "请输入预算金额" }]
  202. }
  203. }
  204. },
  205. computed: {
  206. isEngineering() {
  207. return this.formatType(this.form.type) == "工程类";
  208. },
  209. deptProject() {
  210. return this.projects.filter(p => p.deptId == this.form.belongDeptId);
  211. }
  212. },
  213. mounted() {
  214. this.getProjects();
  215. if (this.id) this.setData();
  216. },
  217. methods: {
  218. formatType(value) {
  219. const dicts = this.$refs.dictSelect && this.$refs.dictSelect.options || [];
  220. return dicts && dicts.find(d => d.value == value) && dicts.find(d => d.value == value).label || "";
  221. },
  222. formatDeptName(value) {
  223. const depts = this.$refs.deptTreeSelect && this.$refs.deptTreeSelect.treeList || [];
  224. return depts && depts.find(d => d.deptId == value) && depts.find(d => d.deptId == value).name || "";
  225. },
  226. formatProjectName(value) {
  227. return this.projects.find(p => p.id == value) && this.projects.find(p => p.id == value).projectName || "";
  228. },
  229. async getProjects() {
  230. this.projects = await this.$API.system.project.all({ orderBy: "id_desc", projectStatus: "active" });
  231. },
  232. // 表单注入数据
  233. async setData() {
  234. try {
  235. this.loading = true;
  236. const { purchase } = await this.$API.procurement.apply.detail({ id: this.id });
  237. this.loading = false;
  238. for (const key in this.form) {
  239. if (key == "isInPlan") this.form[key] = !!purchase[key];
  240. else if (key == "isShare") this.form[key] = purchase[key];
  241. else if (key == "isLawyer") this.form[key] = !!purchase[key] && 1 || 0;
  242. else if (key == "purchaseLaw") {
  243. if (purchase.isLawyer == 1) {
  244. this.form[key] = purchase[key] || null;
  245. this.$nextTick(() => this.$refs.lawyerSelection.setData(purchase.purchaseLaw));
  246. } else this.form[key] = null;
  247. } else if (key == "folders") {
  248. if (purchase[key]) {
  249. for (const folder_key in this.form[key]) {
  250. this.form[key][folder_key]["entities"] = purchase[key][folder_key].entities.map(({ id, mineType, name, path }) => ({ id, mineType, name, path })) || []
  251. }
  252. }
  253. } else {
  254. this.form[key] = purchase[key] || null;
  255. if (key == "planId" && purchase[key]) this.tableSelect.modelValue = { id: purchase[key], planName: purchase["planName"] }
  256. }
  257. }
  258. } catch (error) {
  259. this.loading = false;
  260. }
  261. },
  262. tableSelectChange(e) {
  263. if (e) {
  264. this.form.planId = e.id;
  265. this.form.planName = e.name;
  266. this.form.type = e.type;
  267. this.form.budgetAmount = e.budgetAmount;
  268. } else {
  269. this.form.planId = null;
  270. this.form.planName = null;
  271. }
  272. },
  273. deptChange() {
  274. this.form.projectId = null;
  275. this.projectChange();
  276. },
  277. projectChange(e) {
  278. this.form.projectNo = this.projects.find(p => p.id == e) && this.projects.find(p => p.id == e).projectNo || null;
  279. this.tableSelect.params.projectId = e;
  280. this.radioChange();
  281. },
  282. radioChange(e) {
  283. if (!e) {
  284. this.tableSelect.modelValue = null;
  285. this.tableSelectChange();
  286. }
  287. },
  288. typeChange() {
  289. if (this.isEngineering) this.form.specialFeeType = null;
  290. }
  291. }
  292. }
  293. </script>
  294. <style lang="scss" scoped>
  295. .dialog-form {
  296. padding: 10px 30px 0 20px;
  297. .input-number-suffix {
  298. position: absolute;
  299. right: 30px;
  300. color: #262626;
  301. }
  302. .iframe-item__btn :deep(.el-form-item__content) {
  303. justify-content: flex-end;
  304. }
  305. }
  306. .dialog-form-disabled {
  307. :deep(.sc-upload-file) {
  308. .el-upload {
  309. display: none;
  310. }
  311. .el-upload-list.is-disabled {
  312. margin-top: 0;
  313. }
  314. }
  315. }
  316. .dialog-form + .dialog-form {
  317. padding-top: 0;
  318. padding-bottom: 10px;
  319. }
  320. .dialog-form-disabled + .dialog-form {
  321. padding-bottom: 20px;
  322. }
  323. @media (max-width: 992px) {
  324. .dialog-form {
  325. padding: 10px 10px 0;
  326. }
  327. .dialog-form + .dialog-form {
  328. padding-top: 0;
  329. padding-bottom: 10px;
  330. }
  331. }
  332. </style>