addEdit.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. <template>
  2. <u-sticky class="shadow-default" bgColor="#fff" style="top: 0">
  3. <u-navbar :titleStyle="{ color: '#000' }" :autoBack="true" :title="pageTitle" :placeholder="true" :safeAreaInsetTop="true" bgColor="#fff">
  4. <template #left>
  5. <view class="u-navbar__content__left__item">
  6. <u-icon name="arrow-left" size="20" color="#000"></u-icon>
  7. </view>
  8. </template>
  9. </u-navbar>
  10. </u-sticky>
  11. <oa-scroll
  12. customClass="record-container scroll-height"
  13. :isSticky="false"
  14. :customStyle="{
  15. //#ifdef APP-PLUS || MP-WEIXIN
  16. height: 'calc(100vh - 44px)',
  17. //#endif
  18. }"
  19. :refresherLoad="false"
  20. :refresherEnabled="false"
  21. :refresherDefaultStyle="'none'"
  22. :refresherThreshold="44"
  23. :lowerThreshold="44"
  24. :refresherBackground="'#f5f6f7'"
  25. :data-theme="'theme-' + proxy.$settingStore.themeColor.name"
  26. >
  27. <template #default>
  28. <view class="content-area">
  29. <view class="content-area-item mt10 p10 bg-white">
  30. <view class="font14 weight mb10 required">项目名称</view>
  31. <u-input v-model="form.projectName" placeholder="请输入" fontSize="14px" placeholderStyle="color:#909399;font-size:12px" border="none"> </u-input>
  32. </view>
  33. <view class="content-area-item mt10 p10 bg-white">
  34. <view class="font14 weight mb10 required">项目类型</view>
  35. <u-input
  36. :modelValue="proxy.$common.mapping('label', 'value', form.projectType, project_type)"
  37. fontSize="14px"
  38. placeholderStyle="color:#909399;font-size:12px"
  39. placeholder="请选择"
  40. border="none"
  41. disabledColor="transparent"
  42. disabled
  43. />
  44. <u-button class="mt20" type="primary" style="width: 100px; height: 25px" @click="handleAction('项目类型', project_type)" shape="circle" icon="plus" size="mini"> 选择项目类型 </u-button>
  45. </view>
  46. <view class="content-area-item mt10 p10 bg-white">
  47. <view class="font14 weight mb10 required">项目状态</view>
  48. <u-input
  49. :modelValue="proxy.$common.mapping('label', 'value', form.projectStatus, project_status)"
  50. fontSize="14px"
  51. placeholderStyle="color:#909399;font-size:12px"
  52. placeholder="请选择"
  53. border="none"
  54. disabledColor="transparent"
  55. disabled
  56. />
  57. <u-button class="mt20" type="primary" style="width: 100px; height: 25px" @click="handleAction('项目状态', project_status)" shape="circle" icon="plus" size="mini"> 选择项目状态 </u-button>
  58. </view>
  59. <view class="content-area-item mt10 p10 bg-white">
  60. <view class="font14 weight mb10 required">项目负责人</view>
  61. <avatarList :userList="projectHeadList" @deleteUsers="(value) => deleteUsers(value, 'projectHeadList')" />
  62. <u-button class="mt20" type="primary" style="width: 100px; height: 25px" @click="insertUsers('projectHeadList')" shape="circle" icon="plus" size="mini"> 选择项目负责人 </u-button>
  63. </view>
  64. <view class="content-area-item mt10 p10 bg-white">
  65. <view class="font14 weight mb10">计划人/天</view>
  66. <u-input v-model="form.projectWorkload" placeholder="请输入" fontSize="14px" placeholderStyle="color:#909399;font-size:12px" type="digit" border="none"> </u-input>
  67. </view>
  68. <view class="content-area-item mt10 p10 bg-white">
  69. <view class="font14 weight mb10">项目成员</view>
  70. <avatarList :userList="projectMemberList" @deleteUsers="(value) => deleteUsers(value, 'projectMemberList')" />
  71. <u-button class="mt20" type="primary" style="width: 100px; height: 25px" @click="insertUsers('projectMemberList')" shape="circle" icon="plus" size="mini"> 选择项目成员 </u-button>
  72. </view>
  73. <view class="content-area-item mt10 p10 bg-white">
  74. <view class="font14 weight mb10">项目描述</view>
  75. <u-textarea
  76. v-model="form.projectDescribe"
  77. placeholder="请输入"
  78. placeholderStyle="color:#909399;font-size:12px"
  79. confirmType="return"
  80. :autoHeight="true"
  81. :maxlength="-1"
  82. :height="'100%'"
  83. border="none"
  84. style="padding: 0px"
  85. @change="realTimeSaving()"
  86. ></u-textarea>
  87. </view>
  88. </view>
  89. <view class="app-button">
  90. <view class="app-button-padding"></view>
  91. <view class="app-button-fixed">
  92. <u-button class="app-buttom" type="primary" @click="handleSubmit('提交')" shape="circle"> 提交 </u-button>
  93. </view>
  94. </view>
  95. </template>
  96. </oa-scroll>
  97. <u-picker
  98. :show="actionShow"
  99. :columns="actionsList"
  100. :title="'请选择' + actionTitle"
  101. keyName="label"
  102. visibleItemCount="6"
  103. :defaultIndex="[actionDefaultIndex]"
  104. :closeOnClickOverlay="true"
  105. @close="actionShow = false"
  106. @cancel="actionShow = false"
  107. @confirm="selectAction"
  108. ></u-picker>
  109. </template>
  110. <script setup>
  111. /*----------------------------------依赖引入-----------------------------------*/
  112. import { onLoad, onShow, onReady, onHide, onLaunch, onUnload, onNavigationBarButtonTap, onPageScroll } from "@dcloudio/uni-app";
  113. import { ref, reactive, computed, getCurrentInstance, toRefs, inject } from "vue";
  114. /*----------------------------------接口引入-----------------------------------*/
  115. import { projectApi } from "@/api/business/project.js";
  116. import { dUserList } from "@/api/system/user.js";
  117. /*----------------------------------组件引入-----------------------------------*/
  118. import avatarList from "../components/avatarList.vue";
  119. /*----------------------------------store引入-----------------------------------*/
  120. import { systemStores } from "@/store/modules/index";
  121. /*----------------------------------公共方法引入-----------------------------------*/
  122. import { storageSystem } from "@/utils/storage"; // 公共方法引用
  123. /*----------------------------------公共变量-----------------------------------*/
  124. const systemStore = systemStores();
  125. const { proxy } = getCurrentInstance();
  126. const { project_status, project_type, project_ascription } = proxy.useDict("project_status", "project_type", "project_ascription");
  127. const props = defineProps({
  128. id: {
  129. type: String,
  130. default: undefined,
  131. },
  132. });
  133. /*----------------------------------变量声明-----------------------------------*/
  134. const uForm = ref(null);
  135. const state = reactive({
  136. pageTitle: "",
  137. userDate: [],
  138. projectKey: "",
  139. projectHeadList: [],
  140. projectMemberList: [],
  141. form: {
  142. projectId: undefined,
  143. projectName: "", //项目名称
  144. projectType: undefined, //项目类型
  145. projectStatus: undefined, //项目状态
  146. projectWorkload: "", //计划人/天
  147. projectHead: undefined, //项目负责人
  148. projectMember: "", //项目成员
  149. projectDescribe: "", //项目描述
  150. // startTime: "2022-10-01T01:00:00",
  151. // endTime: "2023-03-31T23:59:59",
  152. },
  153. actionShow: false,
  154. actionTitle: "",
  155. actionsList: [],
  156. actionDefaultIndex: 0,
  157. });
  158. const { pageTitle, projectHeadList, projectMemberList, form, rules, actionShow, actionTitle, actionsList, actionDefaultIndex } = toRefs(state);
  159. /** 添加人员按钮事件 */
  160. function insertUsers(key) {
  161. state.projectKey = key;
  162. //将人员选中数据传入store中
  163. systemStore.mallList.activeUserList = state[key];
  164. if (key === "projectHeadList") {
  165. proxy.$tab.navigateTo(`/pages/business/common/projectMange/mall/index?number=1`);
  166. } else if (key === "projectMemberList") {
  167. proxy.$tab.navigateTo(`/pages/business/common/projectMange/mall/index?number=50`);
  168. }
  169. }
  170. /** 删除人员按钮事件 */
  171. function deleteUsers(index, key) {
  172. state[key].splice(index, 1);
  173. }
  174. /**
  175. * @action弹出框点击事件
  176. */
  177. function handleAction(title, event, index, ind) {
  178. state.actionTitle = title;
  179. state.actionIndex = index;
  180. state.actionsList[0] = event;
  181. state.actionDefaultIndex = 0;
  182. state.actionShow = true;
  183. }
  184. /**
  185. * @action弹出框选择事件
  186. */
  187. function selectAction(e) {
  188. if (state.actionTitle == "项目类型") {
  189. state.form.projectType = e.value[0].value; //项目名称
  190. } else if (state.actionTitle == "项目状态") {
  191. state.form.projectStatus = e.value[0].value; //项目名称
  192. }
  193. state.actionShow = false;
  194. }
  195. /**
  196. * @列表查询
  197. * @api接口查询
  198. */
  199. function selectListApi() {
  200. projectApi()
  201. .ProjectsList({
  202. projectId: parseInt(props.id),
  203. pageNum: 1,
  204. pageSize: 20,
  205. })
  206. .then((requset) => {
  207. if (requset.data.records.length > 0) {
  208. const data = requset.data.records[0];
  209. state.form.projectId = data.id;
  210. state.form.projectName = data.projectName;
  211. state.form.projectType = data.projectType;
  212. state.form.projectStatus = data.projectStatus;
  213. state.form.projectWorkload = data.projectWorkload ? data.projectWorkload : "";
  214. state.form.projectHead = data.projectHead;
  215. state.form.projectMember = data.projectMember;
  216. state.form.projectDescribe = data.projectDescribe;
  217. }
  218. var projectMember = state.form.projectMember.length > 0 ? state.form.projectMember.split(",").map((num) => Number(num)) : [];
  219. state.userDate.forEach((e) => {
  220. if (projectMember.includes(e.userId)) {
  221. state.projectMemberList.push({
  222. address: e.address,
  223. avatar: e.avatar,
  224. deptId: e.deptId,
  225. email: e.email,
  226. id: e.userId,
  227. label: e.nickName,
  228. nickName: e.nickName,
  229. phonenumber: e.phonenumber,
  230. post: e.post,
  231. sex: e.sex,
  232. userId: e.userId,
  233. userName: e.userName,
  234. });
  235. }
  236. var projectHead = state.form.projectHead ? [state.form.projectHead] : [];
  237. if (projectHead.includes(e.userId)) {
  238. state.projectHeadList.push({
  239. address: e.address,
  240. avatar: e.avatar,
  241. deptId: e.deptId,
  242. email: e.email,
  243. id: e.userId,
  244. label: e.nickName,
  245. nickName: e.nickName,
  246. phonenumber: e.phonenumber,
  247. post: e.post,
  248. sex: e.sex,
  249. userId: e.userId,
  250. userName: e.userName,
  251. });
  252. }
  253. });
  254. })
  255. .catch((err) => {});
  256. }
  257. /**
  258. * @提交
  259. */
  260. function handleSubmit(value) {
  261. if (!state.form.projectName) {
  262. proxy.$modal.msg("请输入项目名称!");
  263. return;
  264. }
  265. if (!state.form.projectType) {
  266. proxy.$modal.msg("请选择项目类型!");
  267. return;
  268. }
  269. if (!state.form.projectStatus) {
  270. proxy.$modal.msg("请选择项目状态!");
  271. return;
  272. }
  273. if (state.projectHeadList.length <= 0) {
  274. proxy.$modal.msg("请选择项目负责人!");
  275. return;
  276. }
  277. state.form.projectHead = state.projectHeadList[0].id;
  278. state.form.projectMember = state.projectMemberList.map((obj) => `${obj.id}`).join(",");
  279. proxy.$modal.loading("加载中");
  280. projectApi()
  281. .ProjectsInsertUpdate({
  282. id: state.form.projectId,
  283. projectName: state.form.projectName, //项目名称
  284. projectType: state.form.projectType, //项目类型
  285. projectStatus: state.form.projectStatus, //项目状态
  286. projectWorkload: state.form.projectWorkload, //计划人/天
  287. projectHead: state.form.projectHead, //项目负责人
  288. projectMember: state.form.projectMember, //项目成员
  289. projectDescribe: state.form.projectDescribe, //项目描述
  290. // startTime: "2022-10-01T01:00:00",
  291. // endTime: "2023-03-31T23:59:59",
  292. })
  293. .then(() => {
  294. state.projectKey = "";
  295. state.projectHeadList = [];
  296. state.projectMemberList = [];
  297. state.form = {
  298. projectId: undefined,
  299. projectName: "", //项目名称
  300. projectType: undefined, //项目类型
  301. projectStatus: undefined, //项目状态
  302. projectWorkload: "", //计划人/天
  303. projectHead: undefined, //项目负责人
  304. projectMember: "", //项目成员
  305. projectDescribe: "", //项目描述
  306. // startTime: "2022-10-01T01:00:00",
  307. // endTime: "2023-03-31T23:59:59",
  308. };
  309. proxy.$modal.closeLoading();
  310. proxy.$modal.msg("提交成功");
  311. proxy.$tab.navigateBack(1); //返回到需要执行方法的页面
  312. })
  313. .catch((errors) => {
  314. proxy.$modal.closeLoading();
  315. proxy.$modal.msg("提交失败,请稍后重试!");
  316. });
  317. }
  318. onLoad((options) => {
  319. dUserList().then((res) => {
  320. state.userDate = res.data;
  321. });
  322. if ("id" in options) {
  323. state.pageTitle = "项目编辑";
  324. selectListApi();
  325. } else {
  326. state.pageTitle = "项目新增";
  327. }
  328. });
  329. onReady(() => {});
  330. onShow(() => {
  331. //调用系统主题颜色
  332. proxy.$settingStore.systemThemeColor([1]);
  333. //监听组件返回数据
  334. uni.$on("UserMall", function (value) {
  335. console.log(value);
  336. state[state.projectKey] = value;
  337. });
  338. });
  339. onUnload(() => {
  340. uni.$off("UserMall"); //将值删除监听器
  341. });
  342. </script>
  343. <style lang="scss" scoped>
  344. :deep(.u-cell__body) {
  345. color: #000000;
  346. font-size: 12px;
  347. padding: 10px 0px !important;
  348. }
  349. :deep(.u-collapse-item__content) {
  350. overflow: auto;
  351. }
  352. :deep(.u-collapse-item__content__text) {
  353. padding: 0;
  354. }
  355. :deep(.u-cell__left-icon-wrap) {
  356. margin: 0;
  357. }
  358. .content-area {
  359. &-title {
  360. text-align: right;
  361. color: #909399;
  362. }
  363. }
  364. </style>