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

inProgress.vue 9.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. <!--
  2. * @Author: ysh
  3. * @Date: 2024-04-08 13:56:14
  4. * @LastEditors: Please set LastEditors
  5. * @LastEditTime: 2024-04-17 17:58:35
  6. -->
  7. <template>
  8. <div>
  9. <el-skeleton animated :rows="20" v-if="loading" class="app-container" />
  10. <div class="app-container" v-if="!loading">
  11. <h2 style="text-align: center">项目运作情况</h2>
  12. <div class="headers">
  13. 基本作业情况记录
  14. <div class="line"></div>
  15. </div>
  16. <el-form ref="progress" :model="form" :disabled="disabled" label-width="100px">
  17. <el-row :gutter="20" v-if="!noBudget">
  18. <el-col :span="11">
  19. <el-form-item label="使用车辆(车牌号):" label-width="153px">
  20. {{ form.licensePlate }}
  21. </el-form-item>
  22. </el-col>
  23. <el-col :span="11">
  24. <el-form-item label="驾驶员:">
  25. {{ form.driver }}
  26. </el-form-item>
  27. </el-col>
  28. </el-row>
  29. <el-form-item label="参与人员:" v-if="!noBudget">
  30. {{ form.staff }}
  31. </el-form-item>
  32. <div v-if="noBudget">
  33. <el-alert title="项目未做预算表,请先编制预算表" type="warning" effect="dark">
  34. </el-alert>
  35. </div>
  36. <el-row :gutter="20">
  37. <el-col :span="11">
  38. <el-form-item label="进场时间:">
  39. <el-date-picker
  40. type="date"
  41. placeholder="选择日期"
  42. v-model="form.entryTime"
  43. value-format="yyyy-MM-dd"
  44. ></el-date-picker>
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="11">
  48. <el-form-item label="撤场时间:">
  49. <el-date-picker
  50. type="date"
  51. placeholder="选择日期"
  52. v-model="form.exitTime"
  53. value-format="yyyy-MM-dd"
  54. ></el-date-picker>
  55. </el-form-item>
  56. </el-col>
  57. </el-row>
  58. <el-form-item label="项目进度:">
  59. <table border="1">
  60. <tr>
  61. <td style="width: 80px">序号</td>
  62. <td>截止日期</td>
  63. <td>累计总进度(%)</td>
  64. <td style="width: 300px">情况说明</td>
  65. </tr>
  66. <tr v-for="(progress, index) in progressList" :key="index">
  67. <td>
  68. {{ index + 1 }}
  69. </td>
  70. <td>
  71. <el-date-picker
  72. type="date"
  73. placeholder="选择日期"
  74. v-model="progress.date"
  75. value-format="yyyy-MM-dd"
  76. ></el-date-picker>
  77. </td>
  78. <td>
  79. <el-input-number
  80. v-model="progress.percentage"
  81. :controls="false"
  82. style="width: 120px"
  83. ></el-input-number
  84. >%
  85. </td>
  86. <td>
  87. <el-input v-model="progress.situation" type="textarea"></el-input>
  88. </td>
  89. <td>
  90. <el-button
  91. type="danger"
  92. icon="el-icon-minus"
  93. size="mini"
  94. circle
  95. @click="deleProgressItem(index)"
  96. ></el-button>
  97. </td>
  98. </tr>
  99. </table>
  100. <el-button
  101. icon="el-icon-plus"
  102. size="mini"
  103. @click="addProgressList()"
  104. type="primary"
  105. plain
  106. ></el-button>
  107. </el-form-item>
  108. </el-form>
  109. <div class="headers">
  110. 项目借款
  111. <div class="line"></div>
  112. </div>
  113. <div class="headers">
  114. 成果汇交
  115. <div class="line"></div>
  116. </div>
  117. <div class="headers">
  118. 产值结算(内部)
  119. <div class="line"></div>
  120. </div>
  121. <div slot="footer" class="dialog-footer" style="text-align: center">
  122. <el-button @click="preserve()" :disabled="disabled" type="warning"
  123. >保 存</el-button
  124. >
  125. <el-button type="primary" @click="submitNextFlow()" :disabled="disabled"
  126. >提交下一个流程</el-button
  127. >
  128. </div>
  129. </div>
  130. </div>
  131. </template>
  132. <script>
  133. import { mapGetters } from "vuex";
  134. import { parseTime } from "@/utils/ruoyi";
  135. import {
  136. complete,
  137. rejectTask,
  138. returnList,
  139. returnTask,
  140. getNextFlowNode,
  141. delegate,
  142. flowTaskForm,
  143. } from "@/api/flowable/todo";
  144. import {
  145. getProjectComment,
  146. addProjectComment,
  147. updateProjectComment,
  148. } from "@/api/oa/project/projectComment";
  149. import { getUsersDeptLeaderByDept } from "@/api/system/post";
  150. import {
  151. getProjectProgress,
  152. addProjectProgress,
  153. delProjectProgress,
  154. } from "@/api/oa/project/projectProgress";
  155. import { listBudgetCar, getBudgetCar } from "@/api/oa/budget/budgetCar";
  156. import { listBudgetDevice, getBudgetDevice } from "@/api/oa/budget/budgetDevice";
  157. import { listBudgetSettle, getBudgetSettle } from "@/api/oa/budget/budgetSettle";
  158. import { listBudgetStaff, getBudgetStaff } from "@/api/oa/budget/budgetStaff";
  159. import { listBudget } from "@/api/oa/budget/budget";
  160. import { getProject, updateProject } from "@/api/oa/project/project";
  161. import { getCar } from "@/api/oa/car/car";
  162. export default {
  163. computed: {
  164. ...mapGetters(["name", "userId"]),
  165. },
  166. props: {
  167. disabled: {
  168. type: Boolean,
  169. require: true,
  170. },
  171. taskForm: {
  172. type: Object,
  173. required: true,
  174. },
  175. taskName: {
  176. type: String,
  177. required: true,
  178. },
  179. },
  180. data() {
  181. return {
  182. loading: true,
  183. form: {
  184. licensePlate: "",
  185. driver: "",
  186. staff: "",
  187. entryTime: "",
  188. exitTime: "",
  189. },
  190. rules: {
  191. manageComment: [{ required: true, message: "请输入审核意见", trigger: "blur" }],
  192. },
  193. progressList: [
  194. {
  195. date: "",
  196. percentage: "",
  197. situation: "",
  198. },
  199. ],
  200. noBudget: true,
  201. budgetId: "",
  202. };
  203. },
  204. watch: {
  205. taskName(newval, oldval) {
  206. if (newval == "项目生产") {
  207. this.doesItExistBudget(this.taskForm.formId);
  208. }
  209. },
  210. },
  211. created() {
  212. if (this.taskName == "项目生产") {
  213. this.doesItExistBudget(this.taskForm.formId);
  214. this.initProgress();
  215. }
  216. },
  217. methods: {
  218. initProgress() {
  219. getProject(this.taskForm.formId).then(res => {
  220. if (res.data) {
  221. this.form.entryTime = res.data.entryTime;
  222. this.form.exitTime = res.data.exitTime;
  223. }
  224. });
  225. getProjectProgress(this.taskForm.formId).then(res => {
  226. if (res.data.length != 0) {
  227. this.progressList = res.data;
  228. }
  229. });
  230. },
  231. // 查询是否有预算表
  232. doesItExistBudget(projectId) {
  233. listBudget({ projectId }).then(res => {
  234. this.loading = false;
  235. if (res.total == 0) {
  236. } else {
  237. this.noBudget = false;
  238. this.budgetId = res.rows[0].budgetId;
  239. getBudgetCar(this.budgetId).then(res => {
  240. let carArr = [];
  241. let carDriverList = [];
  242. for (let i of res.data) {
  243. carArr.push(i.car.licensePlate);
  244. getCar(i.carId).then(res => {
  245. carDriverList.push(res.data.driverUser.nickName);
  246. this.form.driver = carDriverList.join("、");
  247. });
  248. }
  249. this.form.licensePlate = carArr.join("、");
  250. });
  251. getBudgetStaff(this.budgetId).then(res => {
  252. let userArr = [];
  253. for (let u of res.data) {
  254. userArr.push(u.user.nickName);
  255. }
  256. this.form.staff = userArr.join("、");
  257. });
  258. }
  259. });
  260. },
  261. addProgressList() {
  262. this.progressList.push({
  263. date: "",
  264. percentage: "",
  265. situation: "",
  266. });
  267. },
  268. deleProgressItem(index) {
  269. let arr = this.progressList;
  270. if (arr.length == 1) {
  271. return;
  272. }
  273. if (index >= 0 && index < arr.length) {
  274. arr.splice(index, 1);
  275. }
  276. },
  277. handleAddProgress(form) {
  278. addProjectProgress(form);
  279. },
  280. // 暂存数据
  281. preserve() {
  282. delProjectProgress([this.taskForm.formId]).then(res => {
  283. for (let progress of this.progressList) {
  284. progress.projectId = this.taskForm.formId;
  285. addProjectProgress(progress);
  286. }
  287. });
  288. updateProject({
  289. projectId: this.taskForm.formId,
  290. entryTime: this.form.entryTime,
  291. exitTime: this.form.exitTime,
  292. }).then(res => {
  293. this.$message.success("保存成功");
  294. });
  295. },
  296. submitNextFlow() {},
  297. },
  298. };
  299. </script>
  300. <style lang="scss" scoped>
  301. .auditor {
  302. font-family: "华文行楷";
  303. font-size: 20px;
  304. }
  305. table {
  306. /*边框*/
  307. /* border: 1px solid black; */
  308. text-align: center;
  309. border-collapse: collapse;
  310. /*设置背景颜色*/
  311. /* background-color: #bfa; */
  312. }
  313. .headers {
  314. position: relative;
  315. font-weight: bold;
  316. font-size: 18px;
  317. padding-left: 40px;
  318. padding-bottom: 40px;
  319. .line {
  320. position: absolute;
  321. left: 22px;
  322. top: 5px;
  323. width: 5px;
  324. height: 14px;
  325. border-radius: 10px;
  326. background-color: #2893e5;
  327. }
  328. }
  329. ::v-deep .el-textarea.is-disabled .el-textarea__inner {
  330. color: #121212 !important;
  331. }
  332. </style>