综合办公系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

addproject.vue 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. <!--
  2. * @Author: ysh
  3. * @Date: 2024-02-27 14:49:15
  4. * @LastEditors: Please set LastEditors
  5. * @LastEditTime: 2024-05-20 16:15:23
  6. -->
  7. <template>
  8. <div class="project-wrapper">
  9. <!-- 项目登记 -->
  10. <h2 style="text-align: center">项目登记</h2>
  11. <el-form :model="addForm" :rules="rules" label-width="100px" :disabled="disabled">
  12. <el-row :gutter="20">
  13. <el-col :span="12">
  14. <el-form-item label="项目编号:" prop="projectNumber">
  15. <el-input v-model="addForm.projectNumber"></el-input>
  16. </el-form-item>
  17. </el-col>
  18. <el-col :span="12">
  19. <el-form-item label="合同编码:">
  20. <el-input v-model="contractCode" disabled></el-input>
  21. </el-form-item>
  22. </el-col>
  23. </el-row>
  24. <el-row :gutter="20">
  25. <el-col :span="12"><el-form-item label="项目名称:" prop="projectName">
  26. <el-input v-model="addForm.projectName"></el-input>
  27. </el-form-item>
  28. </el-col>
  29. <el-col :span="12">
  30. <el-form-item label="合同编号:">
  31. <el-input v-model="contractNumber" disabled></el-input>
  32. </el-form-item>
  33. </el-col>
  34. </el-row>
  35. <el-form-item label="项目类型:" prop="projectType">
  36. <el-input v-model="addForm.projectType"></el-input>
  37. </el-form-item>
  38. <el-form-item label="项目级别:" prop="projectLevel">
  39. <el-radio v-model="addForm.projectLevel" label="0">一般项目</el-radio>
  40. <el-radio v-model="addForm.projectLevel" label="1">重大项目</el-radio>
  41. </el-form-item>
  42. <el-form-item label="项目来源:" prop="projectSource">
  43. <el-radio v-model="addForm.projectSource" label="0">院内</el-radio>
  44. <el-radio v-model="addForm.projectSource" label="1">院外</el-radio>
  45. </el-form-item>
  46. <el-form-item label="甲方单位:" prop="partyA">
  47. <el-autocomplete class="inline-input" v-model="addForm.partyA" :fetch-suggestions="querySearch"
  48. placeholder="请输入内容" style="width: 100%"></el-autocomplete>
  49. <!-- <el-input v-model="addForm.partyA"></el-input> -->
  50. </el-form-item>
  51. <el-form-item label="联系人:" prop="contactPerson">
  52. <el-input v-model="addForm.contactPerson"></el-input>
  53. </el-form-item>
  54. <el-form-item label="联系电话:" prop="telephone">
  55. <el-input v-model="addForm.telephone"></el-input>
  56. </el-form-item>
  57. <el-form-item label="项目概况:">
  58. <table border="1">
  59. <tr>
  60. <td style="width: 180px">工作内容</td>
  61. <td>等级或比例尺</td>
  62. <td>单位</td>
  63. <td>工作量</td>
  64. <td style="width: 100px">要求完成时间</td>
  65. <td>备注</td>
  66. </tr>
  67. <tr v-for="(work, index) in workList" :key="index">
  68. <td>
  69. <el-input v-model="work.content" type="textarea" clearable
  70. :autosize="{ minRows: 4, maxRows: 10 }"></el-input>
  71. </td>
  72. <td>
  73. <el-select v-model="work.scale" placeholder="请选择" clearable>
  74. <el-option v-for="dict in dict.type.cmc_scale_grade" :key="dict.value" :label="dict.label"
  75. :value="dict.label" />
  76. </el-select>
  77. </td>
  78. <td>
  79. <el-select v-model="work.unit" placeholder="请选择" clearable>
  80. <el-option v-for="dict in dict.type.cmc_unit" :key="dict.value" :label="dict.label"
  81. :value="dict.label" />
  82. </el-select>
  83. </td>
  84. <td>
  85. <el-input v-model="work.workload" clearable></el-input>
  86. </td>
  87. <td>
  88. <el-date-picker style="width: 140px" v-model="work.deadline" value-format="yyyy-MM-dd" type="date"
  89. placeholder="选择日期">
  90. </el-date-picker>
  91. </td>
  92. <td>
  93. <el-input v-model="work.remark" type="textarea" clearable
  94. :autosize="{ minRows: 4, maxRows: 10 }"></el-input>
  95. </td>
  96. <td>
  97. <el-button type="danger" icon="el-icon-minus" size="mini" circle
  98. @click="deletWorkItem(index)"></el-button>
  99. </td>
  100. </tr>
  101. </table>
  102. <el-button icon="el-icon-plus" size="mini" @click="addWorkList"></el-button>
  103. </el-form-item>
  104. <el-form-item label="备注:" prop="remark">
  105. <el-input v-model="addForm.remark" type="textarea" rows="3"></el-input>
  106. </el-form-item>
  107. <el-row>
  108. <el-col :span="6" :xs="24" :offset="12">
  109. <el-form-item label="项目登记人:" prop="registrantUser">
  110. <span class="auditor"> {{ addForm.projectRegistrantUser ? addForm.projectRegistrantUser.nickName :
  111. registrantUser }} </span>
  112. </el-form-item>
  113. </el-col>
  114. <el-col :span="6">
  115. <el-form-item label="登记日期:" label-width="120px">
  116. <span> {{ addForm.registerTime ? addForm.registerTime : registerTime }} </span>
  117. </el-form-item>
  118. </el-col>
  119. </el-row>
  120. </el-form>
  121. <div slot="footer" class="dialog-footer" style="text-align: center">
  122. <el-button type="primary" @click="confirmAddForm" :disabled="disabled">提 交</el-button>
  123. <!-- <el-button @click="cancel" :disabled="disabled">取 消</el-button> -->
  124. </div>
  125. </div>
  126. </template>
  127. <script>
  128. import { parseTime } from "@/utils/ruoyi";
  129. import { mapGetters } from "vuex";
  130. import { listProject, getProject, addProject, delProject } from "@/api/oa/project/project";
  131. import { getUser } from "@/api/system/user";
  132. import { getUsersDeptLeaderByDept } from "@/api/system/post";
  133. import { complete, rejectTask, returnList, returnTask, getNextFlowNode, delegate, flowTaskForm } from "@/api/flowable/todo";
  134. import { listProjectWork, addProjectWork } from "@/api/oa/project/projectWork";
  135. import { listProjectContract, addProjectContract } from "@/api/oa/contract/projectContract";
  136. import { listContract, getContract, delContract, addContract, updateContract } from "@/api/oa/contract/contract";
  137. export default {
  138. dicts: ['cmc_scale_grade', 'cmc_unit'],
  139. props: {
  140. disabled: {
  141. type: Boolean,
  142. require: true,
  143. },
  144. taskForm: {
  145. type: Object,
  146. required: true,
  147. },
  148. },
  149. computed: {
  150. ...mapGetters(["userId", "name"]),
  151. },
  152. data() {
  153. return {
  154. registerTime: undefined,
  155. // 查询参数
  156. queryParams: {
  157. pageNum: 1,
  158. pageSize: 10,
  159. projectNumber: "",
  160. projectLeader: "",
  161. projectLeaderName: undefined,
  162. projectName: "",
  163. },
  164. projectList: [],
  165. total: 0,
  166. loading: true,
  167. modifyOpen: false,
  168. addForm: {
  169. registerTime: undefined,
  170. projectRegistrant: "",
  171. },
  172. contractCode: "",
  173. contractNumber: "",
  174. rules: {
  175. projectNumber: [{ required: true, message: "请输入项目编号", trigger: "blur" }],
  176. projectName: [{ required: true, message: "请输入项目名称", trigger: "blur" }],
  177. },
  178. workList: [
  179. {
  180. content: "",
  181. scale: "",
  182. unit: "",
  183. workload: "",
  184. deadline: undefined,
  185. remark: "",
  186. },
  187. ],
  188. restaurants: [{ value: "中国电建集团成都勘测设计研究院有限公司勘测设计分公司" }],
  189. registrantUser: ''
  190. };
  191. },
  192. created() {
  193. this.registerTime = parseTime(new Date(), '{y}-{m}-{d}')
  194. if (this.$route.query.taskName != '项目登记') {
  195. this.getProjectInfo();
  196. this.getProjectWorkList();
  197. } else {
  198. this.addForm.projectRegistrant = this.userId;
  199. this.registrantUser = this.name;
  200. }
  201. this.getContractDataList();
  202. // this.getList();
  203. },
  204. mounted() {
  205. },
  206. methods: {
  207. // 查询项目列表
  208. getList() {
  209. this.loading = true;
  210. listProject(this.queryParams).then(response => {
  211. this.projectList = [];
  212. for (let p of response.rows) {
  213. if (p.projectLeader != null) {
  214. getUser(Number(p.projectLeader)).then(res => {
  215. p.projectLeaderName = res.data.nickName;
  216. });
  217. }
  218. this.projectList.push(p);
  219. }
  220. this.total = response.total;
  221. this.loading = false;
  222. });
  223. },
  224. getProjectInfo() {
  225. getProject(this.taskForm.formId).then(res => {
  226. this.addForm = res.data;
  227. })
  228. },
  229. getProjectWorkList() {
  230. listProjectWork({ projectId: this.taskForm.formId }).then(res => {
  231. this.workList = res.rows;
  232. })
  233. },
  234. getContractDataList() {
  235. listProjectContract({ projectId: this.taskForm.formId }).then(res => {
  236. if (res.rows) {
  237. for (let row of res.rows) {
  238. getContract(row.contractId).then(res => {
  239. if (res.data) {
  240. if (this.contractCode != '') {
  241. this.contractCode = this.contractCode + '、' + res.data.contractCode;
  242. } else {
  243. this.contractCode = res.data.contractCode;
  244. }
  245. if (this.contractNumber != '') {
  246. this.contractNumber = this.contractNumber + '、' + res.data.contractNumber;
  247. } else {
  248. this.contractNumber = res.data.contractNumber;
  249. }
  250. }
  251. })
  252. }
  253. }
  254. })
  255. },
  256. confirmAddForm() {
  257. this.addForm.projectId = this.taskForm.formId;
  258. for (let work of this.workList) {
  259. work.projectId = this.taskForm.formId;
  260. addProjectWork(work);
  261. }
  262. addProject(this.addForm).then(response => {
  263. this.$modal.msgSuccess("新增成功");
  264. this.getList();
  265. });
  266. const params = { taskId: this.taskForm.taskId };
  267. // 获取下一个流程节点
  268. getNextFlowNode(params).then(res => {
  269. getUsersDeptLeaderByDept({ deptId: 107 }).then(res => {
  270. let userId = res.data.userId;
  271. this.$set(this.taskForm.variables, "approval", userId);
  272. complete(this.taskForm).then(response => {
  273. this.$modal.msgSuccess(response.msg);
  274. this.$emit("goBack");
  275. });
  276. });
  277. });
  278. },
  279. cancel() {
  280. this.addForm = {};
  281. },
  282. addWorkList() {
  283. this.workList.push({
  284. content: "",
  285. scale: "",
  286. unit: "",
  287. workload: "",
  288. deadline: undefined,
  289. remark: "",
  290. });
  291. },
  292. deletWorkItem(index) {
  293. let arr = this.workList;
  294. if (arr.length == 1) {
  295. return;
  296. }
  297. if (index >= 0 && index < arr.length) {
  298. arr.splice(index, 1);
  299. }
  300. },
  301. querySearch(queryString, cb) {
  302. var restaurants = this.restaurants;
  303. var results = queryString
  304. ? restaurants.filter(this.createFilter(queryString))
  305. : restaurants;
  306. // 调用 callback 返回建议列表的数据
  307. cb(results);
  308. },
  309. createFilter(queryString) {
  310. return restaurant => {
  311. return restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0;
  312. };
  313. },
  314. },
  315. };
  316. </script>
  317. <style lang="scss" scoped>
  318. @import "@/assets/styles/element-reset.scss";
  319. .project-wrapper {
  320. padding: 25px;
  321. }
  322. .table-header {
  323. background-color: #f5f5f5;
  324. }
  325. .card-header {
  326. display: flex;
  327. justify-content: space-between;
  328. padding: 0 10px;
  329. }
  330. table {
  331. /*居中*/
  332. margin: 0 auto;
  333. /*边框*/
  334. /* border: 1px solid black; */
  335. text-align: center;
  336. border-collapse: collapse;
  337. /*设置背景颜色*/
  338. /* background-color: #bfa; */
  339. }
  340. ::v-deep .el-input.is-disabled .el-input__inner {
  341. color: #686a6e;
  342. }
  343. ::v-deep .el-textarea.is-disabled .el-textarea__inner,
  344. .el-radio__input.is-disabled+span.el-radio__label {
  345. color: #686a6e;
  346. }
  347. ::v-deep .el-radio__input.is-disabled+span.el-radio__label {
  348. color: #686a6e;
  349. }
  350. ::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner::after {
  351. background-color: var(--current-color);
  352. width: 6px;
  353. height: 6px;
  354. }
  355. ::v-deep .el-radio__input.is-disabled .el-radio__inner,
  356. .el-radio__input.is-disabled.is-checked .el-radio__inner {
  357. border-color: var(--current-color);
  358. }
  359. .auditor {
  360. font-family: '华文行楷';
  361. font-size: 20px;
  362. }
  363. </style>