MyProject.vue 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <script setup lang="ts">
  2. import { ElMessage, ElMessageBox } from 'element-plus'
  3. import { GlobalStore } from '@/stores/index'
  4. import { ref, reactive, nextTick, computed } from 'vue'
  5. import { getFormatDuration } from '@/utils/common'
  6. import { UserFilled } from '@element-plus/icons-vue'
  7. import TableBase from '@/components/TableBase/index.vue'
  8. import { ColumnProps } from '@/components/TableBase/interface/index'
  9. import { User_List } from '@/api/user/index'
  10. import Drawer from '@/components/Drawer/index.vue'
  11. import {
  12. User_Power_User_list,
  13. User_Power_Add,
  14. User_Power_Edit,
  15. User_Power_Del,
  16. User_Power_Get
  17. } from '@/api/project/index'
  18. import type { FormInstance, FormRules } from 'element-plus'
  19. import ProjectDetail from './ProjectDetail.vue'
  20. import receiveUser from '@/views/storehouse/outStock/receiveUser.vue'
  21. import { Edit, Delete, View } from '@element-plus/icons-vue'
  22. const isNew = ref(true)
  23. const TableRef = ref()
  24. const disabled = ref(false)
  25. const globalStore = GlobalStore()
  26. const formLabelWidth = ref('120px')
  27. const ruleFormRef = ref<FormInstance>()
  28. const User_tokey = globalStore.GET_User_tokey
  29. const initParam = { User_tokey }
  30. const drawerRef = ref<InstanceType<typeof Drawer> | null>(null)
  31. const receiveUserDrawerRef = ref<InstanceType<typeof receiveUser> | null>(null)
  32. const projectDetailRef = ref<InstanceType<typeof ProjectDetail> | null>(null)
  33. const columns: ColumnProps[] = [
  34. { prop: 'Id', label: 'ID' },
  35. { prop: 'T_name', label: '项目名称' },
  36. { prop: 'T_user_name', label: '项目负责人' },
  37. { prop: 'T_start_date', label: '立项日期' },
  38. { prop: 'T_end_date', label: '结束时间' },
  39. { prop: 'T_planning_cycle', label: '计划完成周期(工作日)' },
  40. { prop: 'T_name', label: '绩效总金额' },
  41. { prop: 'T_State', label: '状态' },
  42. { prop: 'operation', label: '操作', width: 200, fixed: 'right' }
  43. ]
  44. const form = ref({
  45. Id: '',
  46. T_name: '',
  47. T_description: '',
  48. T_detail: '',
  49. T_planning_cycle: '',
  50. T_remark: '',
  51. T_approver: '',
  52. T_uuid: ''
  53. })
  54. const rules = reactive<FormRules>({
  55. T_name: [{ required: true, message: '请输入项目名称', trigger: 'blur' }]
  56. })
  57. const openProjectDrawer = (type: string, row?: any) => {
  58. isNew.value = type === 'new' ? true : false
  59. nextTick(async () => {
  60. if (!isNew.value || type === 'view') {
  61. if (type === 'view') disabled.value = true
  62. form.value = { ...row }
  63. form.value.T_approver = row.T_approver_name
  64. form.value.T_uuid = row.T_approver
  65. const res: any = await User_Power_Get({ T_id: row.Id })
  66. if (res.Code === 200) {
  67. projectDetailRef.value?.setDetailData(res.Data.T_Detail)
  68. }
  69. }
  70. })
  71. drawerRef.value?.openDrawer()
  72. }
  73. const callbackDrawer = (done: () => void) => {
  74. resetForm(ruleFormRef.value)
  75. projectDetailRef.value?.clearDetail()
  76. isNew.value = true
  77. disabled.value = false
  78. done()
  79. }
  80. const resetForm = (formEl: FormInstance | undefined) => {
  81. if (!formEl) return
  82. formEl.resetFields()
  83. }
  84. const getProjectInfo = ({ T_uuid, T_name }: { T_uuid: string; T_name: string }) => {
  85. form.value.T_approver = T_name
  86. form.value.T_uuid = T_uuid
  87. }
  88. const selectApprover = () => receiveUserDrawerRef.value?.openDrawer()
  89. // 计算周期
  90. const getPlanningCycle = (info: any[]) => {
  91. form.value.T_planning_cycle = info.reduce((cur, pre) => {
  92. cur = cur + pre.T_planned_time
  93. return cur
  94. }, 0)
  95. }
  96. // 提交项目
  97. const addProject = (formEl: FormInstance | undefined) => {
  98. if (!formEl) return
  99. formEl.validate(async valid => {
  100. if (valid) {
  101. let res: any = ''
  102. let detail = ''
  103. projectDetailRef.value?.getDetailInfo().forEach((item: any) => {
  104. detail += `${item.T_function},${item.T_planned_time},${item.T_finish}|`
  105. })
  106. const params = {
  107. User_tokey,
  108. ...form.value,
  109. T_detail: detail,
  110. T_approver: form.value.T_uuid
  111. }
  112. if (isNew.value) {
  113. res = await User_Power_Add(params)
  114. } else {
  115. res = await User_Power_Edit({ ...params, T_id: form.value.Id })
  116. }
  117. if (res.Code === 200) {
  118. ElMessage.success(`项目${isNew.value ? '添加' : '修改'}成功!`)
  119. nextTick(() => {
  120. isNew.value = true
  121. TableRef.value?.getTableList()
  122. drawerRef.value?.closeDrawer()
  123. resetForm(ruleFormRef.value)
  124. })
  125. }
  126. } else return false
  127. })
  128. }
  129. // 删除
  130. const DeleteProject = (Id: number) => {
  131. ElMessageBox.confirm('您确定要删除项目吗?', '警告', {
  132. confirmButtonText: '确定',
  133. cancelButtonText: '取消',
  134. type: 'warning'
  135. })
  136. .then(async () => {
  137. const res: any = await User_Power_Del({ User_tokey, T_id: Id })
  138. if (res.Code === 200) {
  139. ElMessage.success('删除成功!')
  140. nextTick(() => {
  141. TableRef.value?.getTableList()
  142. })
  143. }
  144. })
  145. .catch(() => {
  146. ElMessage.warning('取消成功!')
  147. })
  148. }
  149. </script>
  150. <template>
  151. <div class="my-project">
  152. <TableBase ref="TableRef" :columns="columns" :requestApi="User_Power_User_list" :initParam="initParam">
  153. <template #table-header>
  154. <el-row :gutter="20" class="w-100">
  155. <el-col :span="4" :offset="20"
  156. ><el-button type="primary" @click="openProjectDrawer('new')">立项申请</el-button></el-col
  157. >
  158. </el-row>
  159. </template>
  160. <template #right="{ row }">
  161. <el-button link type="success" size="small" :icon="View" @click="openProjectDrawer('view', row)"
  162. >详情</el-button
  163. >
  164. <el-button link type="primary" size="small" :icon="Edit" @click="openProjectDrawer('edit', row)"
  165. >编辑</el-button
  166. >
  167. <el-button link type="danger" size="small" :icon="Delete" @click="DeleteProject(row.Id)">删除</el-button>
  168. </template>
  169. </TableBase>
  170. <Drawer ref="drawerRef" :handleClose="callbackDrawer" size="50%">
  171. <template #header="{ params }">
  172. <h4 :id="params.titleId" :class="params.titleClass">{{ isNew ? '添加' : '编辑' }} - 项目</h4>
  173. </template>
  174. <el-form ref="ruleFormRef" :model="form" :rules="rules">
  175. <el-form-item label="项目名称:" :label-width="formLabelWidth" prop="T_name">
  176. <el-input
  177. v-model="form.T_name"
  178. :disabled="disabled"
  179. type="text"
  180. autocomplete="off"
  181. placeholder="请输入项目名称"
  182. />
  183. </el-form-item>
  184. <el-form-item label="项目简介:" :label-width="formLabelWidth" prop="T_description">
  185. <el-input
  186. v-model="form.T_description"
  187. :disabled="disabled"
  188. :autosize="{ minRows: 6, maxRows: 8 }"
  189. type="textarea"
  190. placeholder="请输入项目简介"
  191. />
  192. </el-form-item>
  193. <el-form-item label="项目明细:" :label-width="formLabelWidth" prop="T_detail">
  194. <ProjectDetail ref="projectDetailRef" @onPlanning="getPlanningCycle" :disabled="disabled"></ProjectDetail>
  195. </el-form-item>
  196. <el-form-item label="计划完成周期:" :label-width="formLabelWidth" prop="T_planning_cycle">
  197. <div style="display: flex; white-space: nowrap; flex: 1">
  198. <el-input
  199. v-model="form.T_planning_cycle"
  200. :disabled="disabled"
  201. type="text"
  202. autocomplete="off"
  203. placeholder="请输入计划完成周期"
  204. />
  205. <span style="margin: 0 10px">工作日</span>
  206. <span style="color: #bbb"
  207. ><el-icon><QuestionFilled /></el-icon>备注;根据项目明细计划时间自动计算</span
  208. >
  209. </div>
  210. </el-form-item>
  211. <el-form-item label="备注:" :label-width="formLabelWidth" prop="T_remark">
  212. <el-input
  213. v-model="form.T_remark"
  214. :disabled="disabled"
  215. :autosize="{ minRows: 4, maxRows: 6 }"
  216. type="textarea"
  217. placeholder="请输入备注信息"
  218. />
  219. </el-form-item>
  220. <el-form-item label="审批人:" :label-width="formLabelWidth" prop="T_approver">
  221. <el-input
  222. v-model="form.T_approver"
  223. :disabled="disabled"
  224. placeholder="请选择审批人"
  225. class="w-50"
  226. @focus="selectApprover"
  227. />
  228. </el-form-item>
  229. <el-form-item :label-width="formLabelWidth" v-if="!disabled">
  230. <el-button v-if="isNew" class="btn" color="#626aef" @click="addProject(ruleFormRef)">提交</el-button>
  231. <el-button v-else class="btn" color="#626aef" @click="addProject(ruleFormRef)">修改</el-button>
  232. </el-form-item>
  233. </el-form>
  234. </Drawer>
  235. <receiveUser ref="receiveUserDrawerRef" @onUserInfo="getProjectInfo" title="选择审批人"></receiveUser>
  236. </div>
  237. </template>
  238. <style scoped lang="scss">
  239. @import '@/styles/var.scss';
  240. :deep(.el-table--enable-row-hover .el-table__body tr) {
  241. transition: all 0.5s ease-in-out;
  242. }
  243. :deep(.el-table--enable-row-hover .el-table__body tr:hover) {
  244. box-shadow: 0 0 6px #dfdfdf;
  245. transform: translateX(-2px);
  246. }
  247. .my-project {
  248. height: 100%;
  249. display: flex;
  250. overflow: hidden;
  251. @include f-direction;
  252. :deep(.table-header),
  253. :deep(.card) {
  254. margin: 0;
  255. border-radius: 8px;
  256. }
  257. .btn {
  258. padding: 0 25px;
  259. }
  260. }
  261. </style>