综合办公系统
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.

arrangeProject.vue 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <!--
  2. * @Author: ysh
  3. * @Date: 2024-03-19 09:24:06
  4. * @LastEditors: Please set LastEditors
  5. * @LastEditTime: 2024-08-05 14:36:35
  6. -->
  7. <template>
  8. <div class="app-container">
  9. <h2 style="text-align: center;">项目安排</h2>
  10. <el-form ref="arrangeForm" :model="form" :rules="rules" label-width="120px" :disabled="disabled">
  11. <el-row :gutter="20">
  12. <el-col :span="12" :xs="24">
  13. <el-form-item label="承担部门:" prop="deptId">
  14. <el-select v-model="form.deptId" multiple clearable style="width:100%" @change="getDeptLeader">
  15. <el-option v-for="item in deptList" :key="item.deptId" :label="item.deptName" :value="item.deptId"
  16. v-if="item.deptName != '四川中水成勘院测绘工程有限责任公司'">
  17. </el-option>
  18. </el-select>
  19. </el-form-item>
  20. </el-col>
  21. <el-col :span="12" :xs="24">
  22. <el-form-item label="部门负责人:" prop="deptLeader">
  23. <el-select v-model="form.deptLeader" multiple clearable style="width:100%">
  24. <el-option v-for="item in $store.state.user.userList" :key="item.userId" :label="item.nickName"
  25. :value="item.userId">
  26. </el-option>
  27. </el-select>
  28. </el-form-item>
  29. </el-col>
  30. </el-row>
  31. <el-row :gutter="20">
  32. <el-col :span="12" :xs="24">
  33. <el-form-item label="项目负责人:" prop="projectLeader">
  34. <el-select v-model="peopleForm.deptId" @change="handleChangeDept" clearable style="width:60%">
  35. <el-option v-for="item in peopleForm.deptList" :key="item.deptId" :label="item.deptName"
  36. :value="item.deptId" v-if="item.deptName != '四川中水成勘院测绘工程有限责任公司'">
  37. </el-option>
  38. </el-select>
  39. <el-select v-model="form.projectLeader" placeholder="请选择项目负责人" clearable style="width:40%">
  40. <el-option v-for="item in peopleForm.userList" :key="item.userId" :label="item.nickName"
  41. :value="item.userId" />
  42. </el-select>
  43. </el-form-item>
  44. </el-col>
  45. <el-col :span="12" :xs="24">
  46. <el-form-item label="现场负责人:" prop="siteLeader">
  47. <el-select v-model="form.siteLeader" filterable clearable style="width:100%">
  48. <el-option v-for="item in peopleForm.allDeptUserList" :key="item.userId" :label="item.nickName"
  49. :value="item.userId" v-if="item.nickName != 'admin'">
  50. </el-option>
  51. </el-select>
  52. </el-form-item>
  53. </el-col>
  54. </el-row>
  55. <!-- <el-row :gutter="20">
  56. <el-col :span="12" :xs="24">
  57. <el-form-item label="组织交底日期:" prop="organizeTime">
  58. <el-date-picker style="width: 100%;" v-model="form.organizeTime" value-format="yyyy-MM-dd" type="date"
  59. placeholder="选择日期">
  60. </el-date-picker>
  61. </el-form-item>
  62. </el-col>
  63. <el-col :span="12" :xs="24">
  64. <el-form-item label="组织交底文档:" prop="organizeDocument">
  65. <div v-if="form.organizeDocument" class="upload-list">
  66. <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + form.organizeDocument}`)">
  67. {{ getFileName(form.organizeDocument) }}
  68. </el-link>
  69. <el-link class="ml20" type="warning" :href="`${baseUrl}${'/profile/upload' + form.organizeDocument}`"
  70. :underline="false" target="_blank">
  71. <span class="el-icon-download">下载文件</span>
  72. </el-link>
  73. </div>
  74. <FileUpload v-if="taskName == '项目安排'" ref="orz" :limit="1" :filePathName="'组织交底文件'"
  75. :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']" @input="setOrganizeDocument">
  76. </FileUpload>
  77. </el-form-item>
  78. </el-col>
  79. </el-row> -->
  80. </el-form>
  81. <div slot="footer" class="dialog-footer" style="text-align: center;">
  82. <el-button type="warning" @click="save" :disabled="disabled">保 存</el-button>
  83. <el-button type="primary" @click="confirmPlanForm" :disabled="disabled">提 交</el-button>
  84. </div>
  85. </div>
  86. </template>
  87. <script>
  88. import { listDept } from '@/api/system/dept'
  89. import { listUser } from '@/api/system/user'
  90. import { getUsersDeptLeaderByDept, getDeptLeadersByDeptId, getUsersManageLeaderByDept } from '@/api/system/post'
  91. import { complete, rejectTask, returnList, returnTask, getNextFlowNode, delegate, flowTaskForm, } from "@/api/flowable/todo";
  92. import { listProject, getProject, addProject, updateProject, delProject, submitProject, modifyProject } from "@/api/oa/project/project";
  93. export default {
  94. props: {
  95. disabled: {
  96. type: Boolean
  97. },
  98. taskForm: {
  99. type: Object,
  100. required: true
  101. },
  102. taskName: {
  103. type: String,
  104. required: true
  105. }
  106. },
  107. data() {
  108. return {
  109. baseUrl: process.env.VUE_APP_BASE_API,
  110. form: {},
  111. rules: {
  112. deptId: [
  113. { required: true, message: "请选择承担部门", trigger: "change" }
  114. ],
  115. projectLeader: [
  116. { required: true, message: "请选择项目负责人", trigger: "change" }
  117. ]
  118. },
  119. deptList: [],
  120. deptLeaderList: [],
  121. file: {
  122. fileList: []
  123. },
  124. peopleVisible: false,
  125. peopleForm: {
  126. deptId: '',
  127. deptList: [],
  128. userId: '',
  129. userList: [],
  130. allDeptUserList: []
  131. },
  132. }
  133. },
  134. created() {
  135. },
  136. mounted() {
  137. this.getDeptList();
  138. this.initForm();
  139. },
  140. methods: {
  141. async initForm() {
  142. let datas = await listProject({ projectId: this.taskForm.formId });
  143. if (datas.rows.length > 0) {
  144. getProject(this.taskForm.formId).then(res => {
  145. this.form = res.data;
  146. if (this.form.undertakingDept != null && this.form.undertakingDept != "" && this.form.undertakingDept != undefined) {
  147. this.form.deptId = this.form.undertakingDeptName.split(',')
  148. }
  149. if (this.form.projectLeaderUser) {
  150. this.form.projectLeaderName = this.form.projectLeaderUser.nickName
  151. }
  152. this.$set(this.form, 'deptLeader', [])
  153. if (this.form.undertakingDept) {
  154. let arr = (this.form.undertakingDept.split(',')).map(Number)
  155. this.$set(this.form, 'deptId', arr)
  156. this.getDeptLeader(arr);
  157. } else {
  158. this.$set(this.form, 'deptId', [])
  159. }
  160. this.$store.commit('SET_PROJECTNUMBER', this.form.projectNumber)
  161. this.$store.commit('SET_PROJECTNAME', this.form.projectName)
  162. this.$store.commit('SET_PROJECT', this.form)
  163. })
  164. }
  165. },
  166. getDeptList() {
  167. listDept({
  168. deptName: undefined,
  169. status: undefined
  170. }).then(res => {
  171. this.deptList = res.data
  172. this.peopleForm.deptList = res.data
  173. })
  174. },
  175. getDeptLeader(val) {
  176. this.deptLeaderList = [];
  177. for (let v of val) {
  178. getUsersDeptLeaderByDept({ deptId: Number(v) }).then(res => {
  179. this.deptLeaderList.push(res.data.userId);
  180. this.form.deptLeader = this.deptLeaderList;
  181. })
  182. }
  183. val.forEach(item => {
  184. listUser({ pageSize: 999, deptId: item }).then(res => {
  185. res.rows.forEach(row => {
  186. this.peopleForm.allDeptUserList.push(row)
  187. })
  188. })
  189. })
  190. this.handleChangeDept(val[0])
  191. },
  192. // 人员选择
  193. choosePeople() {
  194. this.peopleVisible = true;
  195. },
  196. // 改变部门选择
  197. handleChangeDept(deptId) {
  198. this.peopleForm.userId = '';
  199. this.$set(this.peopleForm, 'deptId', deptId)
  200. listUser({ pageSize: 999999, deptId }).then(res => {
  201. this.peopleForm.userList = res.rows
  202. })
  203. },
  204. // 确定项目负责人
  205. confirmPeople() {
  206. this.form.projectLeader = this.peopleForm.userId;
  207. this.form.projectLeaderName = this.tagLeader()
  208. this.peopleVisible = false
  209. },
  210. tagLeader() {
  211. if (this.form.projectLeader == '' || this.form.projectLeader == undefined || this.form.projectLeader == null) {
  212. return undefined
  213. } else {
  214. for (let user of this.peopleForm.userList) {
  215. if (this.form.projectLeader == user.userId) {
  216. return user.nickName
  217. }
  218. }
  219. }
  220. },
  221. cancelChoosePeople() {
  222. this.peopleForm.deptId = '';
  223. this.peopleForm.userId = '';
  224. this.peopleVisible = false;
  225. },
  226. save() {
  227. this.$refs['arrangeForm'].validate((vaild) => {
  228. if (vaild) {
  229. this.form.projectId = this.taskForm.formId;
  230. this.form.undertakingDept = this.form.deptId.join(',');
  231. updateProject(this.form).then(res => {
  232. this.$message.success('保存成功')
  233. })
  234. } else {
  235. this.$message.error('请完善必填项')
  236. }
  237. })
  238. },
  239. confirmPlanForm() {
  240. this.$confirm('项目安排之后会自动发起预算编制、技术方案、技术交底、安全交底四个子流程,将无法进行撤回操作,是否继续提交?', '提示', {
  241. confirmButtonText: '确定',
  242. cancelButtonText: '取消',
  243. type: 'warning'
  244. }).then(async () => {
  245. this.save();
  246. let resData = await getUsersManageLeaderByDept({ deptId: 105 });
  247. let approvalId;
  248. if (resData.data) {
  249. approvalId = resData.data[0].userId;
  250. }
  251. this.$refs['arrangeForm'].validate((vaild) => {
  252. if (vaild) {
  253. const params = { taskId: this.taskForm.taskId };
  254. // 获取下一个流程节点
  255. getNextFlowNode(params).then(res => {
  256. this.$set(this.taskForm.variables, "formId", this.taskForm.formId);
  257. this.$set(this.taskForm.variables, "budgetInitiator", this.peopleForm.userId || this.form.projectLeader);
  258. this.$set(this.taskForm.variables, "planInitiator", this.peopleForm.userId || this.form.projectLeader);
  259. this.$set(this.taskForm.variables, "approval", approvalId);
  260. complete(this.taskForm).then(response => {
  261. this.$modal.msgSuccess(response.msg);
  262. this.$emit('goBack');
  263. });
  264. })
  265. } else {
  266. this.$message.error('请完善必填项')
  267. }
  268. })
  269. })
  270. },
  271. cancel() {
  272. this.form = {}
  273. },
  274. setOrganizeDocument(val) {
  275. let arr = val.split('/upload')
  276. this.form.organizeDocument = arr[1]
  277. if (val == "") {
  278. this.form.organizeDocument = ""
  279. }
  280. },
  281. getFileName(name) {
  282. if (name != null) {
  283. let arr = name.split('/')
  284. return arr[arr.length - 1];
  285. }
  286. },
  287. handleFileDelete() {
  288. // this.$refs.orz.handleDelete(0);
  289. },
  290. }
  291. }
  292. </script>
  293. <style lang="scss" scoped></style>