projectDetail.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <template>
  2. <div class="_ProjectDetail">
  3. <div class="detailHeader">
  4. <div>
  5. <div>
  6. <h2>{{ projectDetail['xmmc'] }}</h2>
  7. <span class="subTitle">({{ projectDetail['xmbh'] }})</span>
  8. <span class="statu">进行中</span>
  9. </div>
  10. <ul>
  11. <li @click="editorProject">{{ !isEditorProject ? '编辑' : '保存' }}</li>
  12. <li>合同签订</li>
  13. <li @click="addSubProject">添加子项目</li>
  14. <li>验收</li>
  15. <li>结项</li>
  16. <li>查看流程</li>
  17. </ul>
  18. </div>
  19. <div>
  20. <p>
  21. <span class="title">合同额(元):</span>
  22. <span class="value">{{ projectDetail['contractAmount'] }}</span>
  23. </p>
  24. <p>
  25. <span class="title">应收款(元):</span>
  26. <span class="value">11500</span>
  27. </p>
  28. <p>
  29. <span class="title">合同余额(元):</span>
  30. <span class="value">17500</span>
  31. </p>
  32. </div>
  33. <div>
  34. <ul>
  35. <li @click="switchComponent(XmxxComp, 0)" :class="currentIndex === 0 ? 'active' : ''"
  36. ><i class="icon"></i>项目信息</li
  37. >
  38. <li
  39. v-if="projectDetail['isSign'] === 1"
  40. @click="switchComponent(XmhtComp, 1)"
  41. :class="currentIndex === 1 ? 'active' : ''"
  42. ><i class="icon"></i>项目合同</li
  43. >
  44. <li @click="switchComponent(XmcbComp, 2)" :class="currentIndex === 2 ? 'active' : ''"
  45. ><i class="icon"></i>项目成本</li
  46. >
  47. <li @click="switchComponent(FjclComp, 3)" :class="currentIndex === 3 ? 'active' : ''"
  48. ><i class="icon"></i>附件材料</li
  49. >
  50. </ul>
  51. <div>
  52. <p>
  53. <i class="icon"></i>
  54. <span class="title">责任部门:</span>
  55. <span class="value">{{ projectDetail['xmjl'] }}</span>
  56. </p>
  57. <p>
  58. <i class="icon"></i>
  59. <span class="title">项目经理:</span>
  60. <span class="value">{{ projectDetail['zrbm'] }}</span>
  61. </p>
  62. </div>
  63. </div>
  64. </div>
  65. <div class="detailContent">
  66. <component
  67. :is="currentComponent"
  68. :detailData="projectDetail"
  69. ref="dynamicRef"
  70. :editor="isEditorProject"
  71. />
  72. </div>
  73. <div class="subProjectModalBox" v-show="subProjectShow">
  74. <ul class="tab">
  75. <li @click="switchTabHandle(0)" :class="[tabIndex === 0 ? 'active' : '']">项目信息</li>
  76. <li @click="switchTabHandle(1)" :class="[tabIndex === 1 ? 'active' : '']">项目成员</li>
  77. </ul>
  78. <span class="close_icon" @click="subProjectShow = false"></span>
  79. <div class="tabContent">
  80. <div class="tabContentOne" v-if="tabIndex === 0">
  81. <div class="formBox">
  82. <el-form :model="projectChildForm" label-width="120px">
  83. <h4>基本信息</h4>
  84. <el-row>
  85. <el-col :span="24">
  86. <el-form-item label="项目名称">
  87. <el-input v-model="projectChildForm.xmmc" />
  88. </el-form-item>
  89. </el-col>
  90. </el-row>
  91. <el-row :gutter="24">
  92. <el-col :span="12">
  93. <el-form-item label="项目经理">
  94. <el-input v-model="projectChildForm.xmjl" />
  95. </el-form-item>
  96. </el-col>
  97. <el-col :span="12">
  98. <el-form-item label="责任部门">
  99. <el-input v-model="projectChildForm.zrbm" />
  100. </el-form-item>
  101. </el-col>
  102. </el-row>
  103. <el-row :gutter="24">
  104. <el-col :span="12">
  105. <el-form-item label="项目编号">
  106. <el-input v-model="projectChildForm.xmbh" />
  107. </el-form-item>
  108. </el-col>
  109. <el-col :span="12">
  110. <el-form-item label="预估工期(天)">
  111. <el-input v-model="projectChildForm.yggq" />
  112. </el-form-item>
  113. </el-col>
  114. </el-row>
  115. <h4>产值信息</h4>
  116. <el-row :gutter="24">
  117. <el-col :span="12">
  118. <el-form-item label="总合同额(元)">
  119. <el-input v-model="projectChildForm.contractAmount" />
  120. </el-form-item>
  121. </el-col>
  122. <el-col :span="12">
  123. <el-form-item label="本项目产值(元)">
  124. <el-input v-model="projectChildForm.outputValue" />
  125. </el-form-item>
  126. </el-col>
  127. </el-row>
  128. <el-row :gutter="24">
  129. <el-col :span="12">
  130. <el-form-item label="利益分成(公司/部门)">
  131. <el-input v-model="projectChildForm.shareRatio" />
  132. </el-form-item>
  133. </el-col>
  134. <el-col :span="12">
  135. <el-form-item label="本项目成本(元)">
  136. <el-input v-model="projectChildForm.projectCost" />
  137. </el-form-item>
  138. </el-col>
  139. </el-row>
  140. </el-form>
  141. </div>
  142. </div>
  143. <div class="tabContentTwo" v-else>
  144. <ul>
  145. <li v-for="(item, index) in 6" :key="index">
  146. <div class="imgBox">
  147. <img src="" />
  148. <i class="icon"></i>
  149. </div>
  150. <div class="userInfo">
  151. <div class="titleBox">
  152. <h4>泮道炬</h4>
  153. <span class="tag">项目经理</span>
  154. </div>
  155. <p class="dept">自然资源产品部</p>
  156. <p class="txt">毕业院校:浙江水利水电职业技术学院</p>
  157. <p class="txt">学历:大专</p>
  158. <p class="txt">电话:15932242593</p>
  159. </div>
  160. <i class="del_icon"><Icon icon="ep:delete" /></i>
  161. </li>
  162. <li class="operation"> <i class="icon"></i>项目成员 </li>
  163. </ul>
  164. </div>
  165. </div>
  166. <div class="btnGroup">
  167. <el-button type="default">取消</el-button>
  168. <el-button type="primary" @click="submitProjectChild">提交</el-button>
  169. </div>
  170. </div>
  171. </div>
  172. </template>
  173. <script setup lang="ts">
  174. import { type Component } from 'vue'
  175. import { useRoute } from 'vue-router'
  176. import request from '@/config/axios'
  177. defineOptions({ name: 'ProjectDetail' })
  178. const dynamicRef = ref<Component>()
  179. const XmxxComp = defineAsyncComponent(() => {
  180. return import('./components/xmxx/index.vue')
  181. })
  182. const XmhtComp = defineAsyncComponent(() => {
  183. return import('./components/xmht/index.vue')
  184. })
  185. const XmcbComp = defineAsyncComponent(() => {
  186. return import('./components/xmcb/index.vue')
  187. })
  188. const FjclComp = defineAsyncComponent(() => {
  189. return import('./components/fjcl/index.vue')
  190. })
  191. const currentComponent = ref<Component>(XmxxComp)
  192. const currentIndex = ref<number>(0)
  193. const switchComponent: (c: Component, i: number) => void = (c: Component, i: number) => {
  194. currentComponent.value = c
  195. currentIndex.value = i
  196. }
  197. const subProjectShow = ref<boolean>(false)
  198. const addSubProject: () => void = () => {
  199. subProjectShow.value = true
  200. }
  201. const tabIndex = ref<number>(0)
  202. const switchTabHandle: (i: number) => void = (i: number) => {
  203. tabIndex.value = i
  204. }
  205. /**
  206. * 项目详情后台接口
  207. * **/
  208. const projectDetail = ref({
  209. xmmc: ''
  210. })
  211. const queryProjectDetail = async (id: any): Promise<void> => {
  212. const urlApi = `/project`
  213. const sendData = {
  214. id: id
  215. }
  216. const result = await request.get({ url: urlApi, params: sendData }, '/business')
  217. projectDetail.value = result
  218. }
  219. const queryProjectWithChild = async (id: any): Promise<void> => {
  220. const urlApi = `/project-with-children`
  221. const sendData = {
  222. id: id
  223. }
  224. const result = await request.get({ url: urlApi, params: sendData }, '/business')
  225. console.log('result~~~~~~~~~~')
  226. console.log(result)
  227. }
  228. const route = useRoute()
  229. const query = route.query
  230. if (query.id) {
  231. queryProjectDetail(query.id)
  232. queryProjectWithChild(query.id)
  233. }
  234. /***
  235. * 添加子项目
  236. * **/
  237. const projectChildForm = ref({
  238. xmmc: '',
  239. xmbh: '',
  240. xmjlId: '',
  241. xmjl: '',
  242. zrbmId: '',
  243. zrbm: '',
  244. yggq: 0,
  245. contractAmount: 0,
  246. projectCost: 0,
  247. outputValue: 0,
  248. shareRatio: 0
  249. })
  250. const addProjectChild = (): void => {
  251. const urlApi = `/project/child`
  252. const sendData = {
  253. pid: query.id,
  254. ...projectChildForm.value
  255. }
  256. request.post({ url: urlApi, data: sendData }, '/business')
  257. }
  258. /***
  259. * 添加项目成员
  260. * **/
  261. const addWorkerRelation = (): void => {
  262. const urlApi = `/project-worker-relation/bind`
  263. const sendData = {
  264. projectId: '',
  265. workerId: ''
  266. }
  267. request.post({ url: urlApi, data: sendData }, '/business')
  268. }
  269. const submitProjectChild = () => {
  270. addProjectChild()
  271. }
  272. /**
  273. * 项目编辑
  274. * **/
  275. const isEditorProject = ref<boolean>(true)
  276. const editorProject: () => void = (): void => {
  277. isEditorProject.value = !isEditorProject.value
  278. dynamicRef.value?.addProjectHandle()
  279. }
  280. </script>
  281. <style lang="scss" scoped>
  282. @import url(./projectDetail.scss);
  283. </style>