projectApproval.vue 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. <template>
  2. <div>
  3. <div
  4. style="height: 300px"
  5. class="bg-white"
  6. >
  7. <div class="basicInformation">
  8. <div style="padding-top: 10px;margin-left: 90px">
  9. <el-image :src="sign" />
  10. </div>
  11. <div style="display: flex;align-items: center">
  12. <el-text
  13. style="margin-left: 10px"
  14. size="large"
  15. tag="b"
  16. >项目基本信息</el-text>
  17. </div>
  18. </div>
  19. <el-form>
  20. <el-row
  21. style="margin:20px 0 0 90px;height: 50px"
  22. align="middle"
  23. >
  24. <el-col :span="5">
  25. <el-form-item
  26. label="项目名称:"
  27. size="large"
  28. prop="name"
  29. >
  30. <el-input
  31. v-model="basicMessage.name"
  32. placeholder="请输入项目名称"
  33. size="large"
  34. />
  35. </el-form-item>
  36. </el-col>
  37. <el-col
  38. :span="5"
  39. :offset="2"
  40. >
  41. <el-form-item
  42. label="负责人:"
  43. size="large"
  44. prop="principal"
  45. >
  46. <el-select
  47. v-model="basicMessage.principal"
  48. placeholder="请选择负责人"
  49. @change="headSelect"
  50. >
  51. <el-option
  52. v-for="item in userList"
  53. :key="item.ID"
  54. :label="item.nickName"
  55. :value="item.nickName"
  56. />
  57. </el-select>
  58. </el-form-item>
  59. </el-col>
  60. <el-col
  61. :span="5"
  62. :offset="2"
  63. >
  64. <el-form-item
  65. label="相关客户:"
  66. size="large"
  67. prop="customer"
  68. >
  69. <el-input
  70. v-model="basicMessage.customer"
  71. placeholder="请输入项目相关客户"
  72. size="large"
  73. />
  74. </el-form-item>
  75. </el-col>
  76. </el-row>
  77. <el-row
  78. style="margin:20px 0 0 90px;height: 50px"
  79. align="middle"
  80. >
  81. <el-col :span="5">
  82. <el-form-item
  83. label="紧急程度:"
  84. size="large"
  85. >
  86. <el-radio-group
  87. v-model="basicMessage.level"
  88. @change="changeUrgency"
  89. >
  90. <el-radio
  91. :value="1"
  92. :label="1"
  93. >正常</el-radio>
  94. <el-radio
  95. :value="2"
  96. :label="2"
  97. >重要</el-radio>
  98. <el-radio
  99. :value="3"
  100. :label="3"
  101. >紧急</el-radio>
  102. </el-radio-group>
  103. </el-form-item>
  104. </el-col>
  105. <el-col
  106. :span="6"
  107. :offset="2"
  108. >
  109. <el-form-item
  110. label="项目金额:"
  111. size="large"
  112. >
  113. <el-input
  114. v-model="projectAmount"
  115. style="max-width: 600px"
  116. placeholder="请输入项目的具体金额"
  117. class="input-with-select"
  118. >
  119. <template #append>
  120. <el-select
  121. v-model="amountUnit"
  122. placeholder="元"
  123. style="width: 100px"
  124. >
  125. <el-option
  126. label="元"
  127. value="元"
  128. />
  129. <el-option
  130. label="万元"
  131. value="万元"
  132. />
  133. </el-select>
  134. </template>
  135. </el-input>
  136. </el-form-item>
  137. </el-col>
  138. </el-row>
  139. <el-row
  140. style="margin:20px 0 0 90px;height: 70px"
  141. >
  142. <el-col :span="19">
  143. <el-form-item
  144. label="项目说明:"
  145. size="large"
  146. >
  147. <el-input
  148. v-model="basicMessage.illustrate"
  149. type="textarea"
  150. placeholder="项目说明(选填)"
  151. :rows="3"
  152. size="large"
  153. />
  154. </el-form-item>
  155. </el-col>
  156. </el-row>
  157. </el-form>
  158. </div>
  159. <div
  160. style="height: 400px;margin-top: 20px"
  161. class="bg-white"
  162. >
  163. <div class="basicInformation">
  164. <div style="padding-top: 10px;margin-left: 90px">
  165. <el-image :src="sign" />
  166. </div>
  167. <div style="display: flex;align-items: center">
  168. <el-text
  169. style="margin-left: 10px"
  170. size="large"
  171. tag="b"
  172. >项目附属文件</el-text>
  173. </div>
  174. </div>
  175. <el-row style="margin:20px 0 0 90px;">
  176. <el-col :span="15">
  177. <el-upload
  178. class="upload-demo"
  179. drag
  180. multiple
  181. :auto-upload="false"
  182. :file-list="fileListData"
  183. :on-change="changeFileData"
  184. :on-remove="removeFileData"
  185. >
  186. <el-icon class="el-icon--upload"><upload-filled /></el-icon>
  187. <div class="el-upload__text">
  188. 请选择需要上传的文件
  189. </div>
  190. <template #tip>
  191. <div class="el-upload__tip">
  192. 选择的文件不要超过500MB
  193. </div>
  194. </template>
  195. </el-upload>
  196. </el-col>
  197. <el-col
  198. :span="4"
  199. :offset="1"
  200. >
  201. <el-button
  202. icon="Collection"
  203. size="large"
  204. type="primary"
  205. @click="approval"
  206. >项目立项</el-button>
  207. </el-col>
  208. </el-row>
  209. </div>
  210. </div>
  211. </template>
  212. <script setup>
  213. import { ref, reactive } from 'vue'
  214. import sign from '@/assets/sign.png'
  215. import moment from 'moment/moment'
  216. import { createProject } from '@/api/project'
  217. import { getAllUsers } from '@/api/user'
  218. import { ElMessage } from 'element-plus'
  219. import { useRouter } from 'vue-router'
  220. const router = useRouter()
  221. defineOptions({
  222. name: 'ProjectApproval'
  223. })
  224. // 项目基本信息
  225. const basicMessage = reactive({
  226. code: '',
  227. name: '',
  228. principal: '',
  229. price: 0,
  230. level: 1,
  231. customer: '',
  232. illustrate: '',
  233. state: 1
  234. })
  235. const projectAmount = ref('')
  236. // 项目用户列表
  237. const userList = reactive([])
  238. getAllUsers().then(res => {
  239. if (res.code === 0) {
  240. userList.push(...res.data)
  241. }
  242. })
  243. // 项目文件列表
  244. const fileListData = ref([])
  245. // 金额单位
  246. const amountUnit = ref('元')
  247. // 修改负责人
  248. const headSelect = (value) => {
  249. basicMessage.principal = value
  250. }
  251. // 修改文件数据
  252. const changeFileData = (file, fileList) => {
  253. fileListData.value = fileList
  254. }
  255. const removeFileData = (file, fileList) => {
  256. fileListData.value = fileList
  257. }
  258. // 项目紧急程度
  259. function changeUrgency(value) {
  260. basicMessage.level = value
  261. }
  262. // 项目立项
  263. const approval = () => {
  264. const basic = basicMessage
  265. basic.code = 'LCZM' + createCode()
  266. if (projectAmount.value === '') {
  267. basic.price = 0
  268. } else {
  269. if (amountUnit.value === '万元') {
  270. basic.price = parseInt(projectAmount.value) * 10000
  271. } else {
  272. basic.price = parseInt(projectAmount.value)
  273. }
  274. }
  275. for (const key in basic) {
  276. if (key === 'illustrate') { /* empty */ } else if (basic[key] === 0 || basic[key] === '') {
  277. ElMessage.error('请将除说明以外的基本信息填写完整')
  278. return
  279. }
  280. }
  281. const formData = new FormData()
  282. const json = JSON.stringify(basic)
  283. if (fileListData.value.length !== 0) {
  284. fileListData.value.forEach(item => {
  285. formData.append('file', item.raw)
  286. })
  287. } else {
  288. formData.append('file', [])
  289. }
  290. formData.append('project', json)
  291. createProject(formData).then(res => {
  292. if (res.code === 0) {
  293. ElMessage({
  294. message: '立项成功',
  295. type: 'success',
  296. })
  297. const { href } = router.resolve({
  298. path: '/layout/projectManage/projectList', // 路径
  299. })
  300. location.href = (href)
  301. } else {
  302. ElMessage({
  303. message: '立项失败',
  304. type: 'error',
  305. })
  306. }
  307. })
  308. }
  309. const createCode = () => {
  310. return moment().format('YYYYMMDDHHmm')
  311. }
  312. </script>
  313. <style scoped lang="less">
  314. .basicInformation{
  315. height: 40px;
  316. background-color: #f8fafd;
  317. display: flex;
  318. //align-items: center;
  319. }
  320. </style>