Ver código fonte

Merge branch 'master' of http://47.100.37.243:10191/wutt/manHourHousekeeper

Min 1 ano atrás
pai
commit
1ed6500c10

+ 12 - 5
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/ExportModal.vue

@@ -37,11 +37,13 @@
 
 <script lang="ts" setup>
 import { ref, watch } from 'vue';
-import { defalutExportForm, PRIORITY,ALL_USERS } from './api';
+import { defalutExportForm, PRIORITY, ALL_USERS } from './api';
 import { post } from '@/utils/request';
 import { Emits, Props } from './type';
+import { dayjs } from 'element-plus';
 const props = defineProps<Props>();
 const emits = defineEmits<Emits>();
+
 watch(() => props.visible, (val) => {
   if (val) {
     form.value = { ...defalutExportForm }
@@ -50,21 +52,26 @@ watch(() => props.visible, (val) => {
     })
   }
 })
+
+const formRef = ref();
+const form = ref<any>({})
+const executorValueData = ref<any>([])
+
 function closeVisible() {
   emits("close")
 }
 function submit() {
-  const { executorId, ...rest } = form.value;
+  const { executorId, startDate, endDate, ...rest } = form.value;
   const data = {
     ...rest,
+    startDate: startDate && dayjs(startDate).format('YYYY-MM-DD 00:00:00'),
+    endDate: endDate && dayjs(endDate).format('YYYY-MM-DD 23:59:59'),
     executorId: executorId.join(','),
   }
   emits("submit", data)
 }
 
-const formRef = ref();
-const form = ref<any>({})
-const executorValueData = ref<any>([])
+
 </script>
 
 <style lang="scss">

+ 7 - 4
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/ImportModal.vue

@@ -14,11 +14,11 @@
       </div>
     </template>
     <div class="text-lg p-5">
-      <div class="pb-5">1. 点击下载 <a href="" download class="text-[#79BBFF]">任务导入模板</a></div>
+      <div class="pb-5">1. 点击下载 <a @click="getTemplate()" class="text-[#79BBFF] cursor-pointer">任务导入模板</a></div>
       <div>2. 填写excel文件, 任务名称与优先级必填</div>
+
     </div>
-    <!-- <el-link type="primary" style="margin-left:5px;" :underline="false" href="./upload/任务导入模板.xlsx"
-      :download="'任务导入模板.xlsx'">任务导入模板</el-link> -->
+    <!--  -->
   </el-dialog>
 </template>
 <script lang="ts" setup>
@@ -27,7 +27,6 @@ import { Props, Emits } from "./type"
 
 const props = defineProps<Props>();
 const emits = defineEmits<Emits>();
-
 watch(() => props.saveLoading, (newValue) => {
   if (!fileInputRef.value) return
   fileInputRef.value.value = ""
@@ -39,6 +38,10 @@ watch(() => props.saveLoading, (newValue) => {
 
 const fileInputRef = ref<HTMLInputElement>();
 
+function getTemplate() {
+
+}
+
 function submit() {
   fileInputRef.value?.click()
 }

+ 7 - 1
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/api.ts

@@ -1,5 +1,4 @@
 import { EpPropMergeType } from "element-plus/es/utils";
-
 export const MOD = "/tasks";
 
 type StatusType = {
@@ -56,3 +55,10 @@ export const UPDATE_TASK_STATUS = `${MOD}/updateTaskStatus`; //更新任务状
 export const UPDATE_TASK = `${MOD}/updateTask`;//修改任务
 
 export const ALL_USERS = "/user/getSimpleActiveUserList"; //获取所有人
+
+export const GET_IMPORT_TEMPLATE = `${MOD}/getImportTemplate`;
+
+export const IMPORT_DATA = `${MOD}/importData`;//导入
+
+export const EXPORT_DATA = `${MOD}/exportData`;//按条件导出
+export const EXPORT_DATA_BY_TASK_ID = `${MOD}/exportDataByTaskIds`;//选中导出

+ 25 - 14
fhKeeper/formulahousekeeper/customerBuler-crm/src/pages/tasks/index.vue

@@ -155,16 +155,16 @@
 </template>
 
 <script lang="ts" setup>
-import { inject, onBeforeMount, onMounted, ref } from 'vue';
+import { inject, onBeforeMount, onMounted, ref, } from 'vue';
 import { useRouter } from 'vue-router';
 import { useStore } from '@/store';
-import { MOD, PRIORITY, STATUS, defaultSearchForm, PAGE_LIST, ADD_TASK, DELETE_TASKS, UPDATE_TASK, UPDATE_TASK_STATUS } from './api';
+import { MOD, PRIORITY, STATUS, defaultSearchForm, PAGE_LIST, ADD_TASK, DELETE_TASKS, UPDATE_TASK, UPDATE_TASK_STATUS, IMPORT_DATA, EXPORT_DATA, EXPORT_DATA_BY_TASK_ID } from './api';
 import { ElTable, dayjs } from 'element-plus';
 import TaskModal from '@/components/TaskModal/index.vue';
 import ImportModal from './ImportModal.vue';
 import ExportModal from './ExportModal.vue';
-import { get, post, uploadFile } from '@/utils/request';
-import { getFromValue, confirmAction } from '@/utils/tools';
+import { post, uploadFile } from '@/utils/request';
+import { getFromValue, confirmAction, downloadFile } from '@/utils/tools';
 import { pushMap } from './type';
 const router = useRouter()
 const { getFunctionList } = useStore()
@@ -215,6 +215,7 @@ const loading = ref<boolean>(false);
 const totalCount = ref<number>(0);
 const tableData = ref<any[]>([])
 function search() {
+  console.log("pageP", pagePermission.value);
   loading.value = true;
   const { startDate, endDate } = searchForm.value;
   let params = {
@@ -281,15 +282,13 @@ function closeImportModal() {
   importVisible.value = false;
 }
 function importExcel(data: any) {
-  console.log("需要提交的数据,importExcel", data);
-  return
   const formData = new FormData();
-  formData.append("file", data);
-  formData.append("projectId", "32277");
+  formData.append("multipartFile", data);
   importLoading.value = "2";
-  uploadFile("/document/uploadDocument", formData).then(_res => {
+  uploadFile(IMPORT_DATA, formData).then(_res => {
     globalPopup?.showSuccess("导入成功")
     importLoading.value = "3";
+    search();
   }).catch(err => {
     globalPopup?.showError(err)
     importLoading.value = "4";
@@ -300,26 +299,38 @@ const exportVisible = ref(false);
 const exportLoading = ref<saveLoadingType>("1");
 const btnLoading = ref(false);
 function exportTasks() {
-  const data = tableRef.value?.getSelectionRows()
+  const data: any[] = tableRef.value?.getSelectionRows()
   if (data.length === 0) {
     // TODO 
     exportVisible.value = true;
     return
   }
   btnLoading.value = true;
-  setTimeout(() => {
+  const taskIds = data.map((v: any) => v.id).join(",");
+  post(EXPORT_DATA_BY_TASK_ID, {
+    taskIds
+  }).then(({ data }) => {
+    downloadFile(data, "任务列表.xlsx");
     btnLoading.value = false;
-  }, 2000)
+  }).catch(err => {
+    btnLoading.value = false;
+    globalPopup?.showError(err)
+  })
 }
 function closeExportModal() {
   exportVisible.value = false;
 }
 function exportExcel(data: any) {
-  console.log("export", data);
   exportLoading.value = "2";
-  setTimeout(() => {
+  post(EXPORT_DATA, getFromValue(data)).then(({ data }) => {
+    downloadFile(data, "任务列表.xlsx");
     exportLoading.value = "3";
     exportVisible.value = false;
+  }).catch(err => {
+    globalPopup?.showError(err)
+  })
+  setTimeout(() => {
+
   }, 2000)
 }
 function editRow(row: any) {

+ 37 - 22
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -521,6 +521,7 @@ public class DingDingServiceImpl implements DingDingService {
                     .setRoleId(smanager.getId())
                     .setRoleName(smanager.getRolename())
                     .setDingdingUserid(authUserId)
+                    .setName(authUserId)//新版,钉钉应用市场的用userId作name
                     .setColor(ColorUtil.randomColor())
                     .setCompanyId(company.getId());
 
@@ -813,11 +814,11 @@ public class DingDingServiceImpl implements DingDingService {
                 JSONArray deptArray = json.getJSONObject("auth_org_scopes").getJSONArray("authed_dept");
                 //如果授权的是全部公司部门,则递归获取子部门和人员
                 if (deptArray.size() == 1 && deptArray.getLong(0) == 1L) {
-                    getDepartmentList(roleId, roleName, dingding.getCompanyId(), dingding.getCorpid(), accessToken, 1L, addTempUserList);
+                    getDepartmentList(roleId, roleName, dingding.getCompanyId(), dingding.getCorpid(), accessToken, 1L, addTempUserList, dingding);
                 } else {
                     for (int i=0;i<deptArray.size(); i++) {
                         long deptId = deptArray.getLongValue(i);
-                        getDepartmentDetailAndUserList(roleId, roleName, dingding.getCompanyId(), dingding.getCorpid(), accessToken, deptId, addTempUserList);
+                        getDepartmentDetailAndUserList(roleId, roleName, dingding.getCompanyId(), dingding.getCorpid(), accessToken, deptId, addTempUserList, dingding);
                     }
                 }
 
@@ -877,7 +878,6 @@ public class DingDingServiceImpl implements DingDingService {
             if (dept.getDdDeptid() != null) {
                 Optional<DepartmentDingding> first = dingdingDeptList.stream().filter(ddpt -> ddpt.getDdDeptid().equals(dept.getDdDeptid())).findFirst();
                 if (first.isPresent()) {
-
                     boolean changed = false;
                     DepartmentDingding departmentDingding = first.get();
                     if (departmentDingding.getDdParentid() == 1) {
@@ -898,7 +898,8 @@ public class DingDingServiceImpl implements DingDingService {
                         }
                     }
 
-                    if (!departmentDingding.getName().equals(dept.getDepartmentName())) {
+                    //只有明文的才需要处理名称变化
+                    if (dingding.getContactNeedTranslate() == 0 && !departmentDingding.getName().equals(dept.getDepartmentName())) {
                         dept.setDepartmentName(departmentDingding.getName());
                         changed = true;
                     }
@@ -957,11 +958,13 @@ public class DingDingServiceImpl implements DingDingService {
                 User upUser = new User();
                 upUser.setId(oldUser.getId());
                 boolean changed = false;
-                if (oldUser.getName() == null || !oldUser.getName().equals(duser.getName())) {
-                    upUser.setName(duser.getName());
-                    System.out.println("更新用户姓名==" + oldUser.getName());
-                    changed = true;
-                }
+                //暂时不更新姓名,避免出现老钉钉用户姓名被冲掉的情况
+                //仅针对老用户,不需要转译的情况下,才可能出现姓名变更的情况
+//                if (dingding.getContactNeedTranslate() == 0 && duser.getName() != null && (oldUser.getName() == null || !oldUser.getName().equals(duser.getName()))) {
+//                    upUser.setName(duser.getName());
+//                    System.out.println("更新用户姓名==userId==" + oldUser.getId() + ", oldName="+ oldUser.getName()+", newName="+duser.getName());
+//                    changed = true;
+//                }
                 //可能需要更新工号
                 if (!StringUtils.isEmpty(duser.getJobNumber()) && (oldUser.getJobNumber() == null || !oldUser.getJobNumber().equals(duser.getJobNumber()))) {
                     upUser.setJobNumber(duser.getJobNumber());
@@ -1503,7 +1506,7 @@ public class DingDingServiceImpl implements DingDingService {
     }
 
     //获取部门详情和部门下的人员
-    public void getDepartmentDetailAndUserList(int roleId, String roleName, Integer companyId, String corpid, String accessToken, long deptId, List<TempDuser> addTempUserList) {
+    public void getDepartmentDetailAndUserList(int roleId, String roleName, Integer companyId, String corpid, String accessToken, long deptId, List<TempDuser> addTempUserList, CompanyDingding companyDingding) {
         try {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get");
             OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest();
@@ -1516,12 +1519,13 @@ public class DingDingServiceImpl implements DingDingService {
                 DepartmentDingding departmentDingding = new DepartmentDingding();
                 departmentDingding.setCorpid(corpid);
                 departmentDingding.setDdDeptid(dept.getInteger("dept_id"));
-                departmentDingding.setName(dept.getString("name"));
+                if (companyDingding.getContactNeedTranslate() == 1) {
+                    departmentDingding.setName(dept.getString("dept_id"));
+                } else {
+                    departmentDingding.setName(dept.getString("name"));
+                }
                 departmentDingding.setDdParentid(dept.getInteger("parent_id"));
                 Department department = new Department();
-                if (departmentDingding.getDdDeptid() == 661842181) {
-                    System.out.println("=========zfind 661842181"+departmentDingding.getName());
-                }
                 department.setCompanyId(companyId);
                 //检查,根部门是公司名称,不需要创建部门
                 if (departmentDingding.getDdDeptid() != 1) {
@@ -1536,7 +1540,7 @@ public class DingDingServiceImpl implements DingDingService {
                             departmentDingding.setId(old.getId());
                             //检查名称是否发生变化
                             System.out.println(departmentDingding.getName()+" -- 已存在:"+departmentDingding.getDdDeptid());
-                            if (!old.getName().equals(departmentDingding.getName()) || !old.getDdParentid().equals(departmentDingding.getDdParentid())) {
+                            if (companyDingding.getContactNeedTranslate() == 0 && (!old.getName().equals(departmentDingding.getName()) || !old.getDdParentid().equals(departmentDingding.getDdParentid()))) {
                                 departmentDingdingMapper.updateById(departmentDingding);
                                 System.out.println("更新该部门");
                             }
@@ -1549,7 +1553,7 @@ public class DingDingServiceImpl implements DingDingService {
                 //获取该部门下的人员, 如果是根部门,不会创建,人员的部门id会使用数据库默认的0
                 getDeptUserIdList(corpid, deptId, accessToken, addTempUserList);
                 //获取子部门
-                getDepartmentList(roleId, roleName, companyId, corpid, accessToken, departmentDingding.getDdDeptid(), addTempUserList);
+                getDepartmentList(roleId, roleName, companyId, corpid, accessToken, departmentDingding.getDdDeptid(), addTempUserList, companyDingding);
             }
         } catch (ApiException e) {
             e.printStackTrace();
@@ -1557,7 +1561,7 @@ public class DingDingServiceImpl implements DingDingService {
     }
 
     //获取该部门下的子部门列表,递归下一级子部门
-    public  String getDepartmentList(int roleId, String roleName, Integer companyId, String corpid, String access_token, long parentDeptId, List<TempDuser> addTempUserList) throws ApiException {
+    public  String getDepartmentList(int roleId, String roleName, Integer companyId, String corpid, String access_token, long parentDeptId, List<TempDuser> addTempUserList, CompanyDingding companyDingding) throws ApiException {
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
         OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
         req.setDeptId(parentDeptId);
@@ -1573,7 +1577,12 @@ public class DingDingServiceImpl implements DingDingService {
                 DepartmentDingding departmentDingding = new DepartmentDingding();
                 departmentDingding.setCorpid(corpid);
                 departmentDingding.setDdDeptid(dept.getInteger("dept_id"));
-                departmentDingding.setName(dept.getString("name"));
+                //TODO:对于钉钉市场的用户,需要通讯录加密的,没有返回部门名称,用部门id替代
+                if (companyDingding.getContactNeedTranslate() == 1) {
+                    departmentDingding.setName(dept.getString("dept_id"));
+                } else {
+                    departmentDingding.setName(dept.getString("name"));
+                }
                 departmentDingding.setDdParentid(dept.getInteger("parent_id"));
                 if (departmentDingding.getDdDeptid() == 661842181) {
                     System.out.println("=========zfind 661842181"+departmentDingding.getName());
@@ -1588,7 +1597,8 @@ public class DingDingServiceImpl implements DingDingService {
                         departmentDingding.setId(old.getId());
                         //检查名称是否发生变化
                         System.out.println(departmentDingding.getName()+" -- 已存在:"+departmentDingding.getDdDeptid());
-                        if (!old.getName().equals(departmentDingding.getName()) || !old.getDdParentid().equals(departmentDingding.getDdParentid())) {
+                        //只有老用户,不需要转译的情况下才可能更新部门名称
+                        if (companyDingding.getContactNeedTranslate() == 0 && (!old.getName().equals(departmentDingding.getName()) || !old.getDdParentid().equals(departmentDingding.getDdParentid()))) {
                             departmentDingdingMapper.updateById(departmentDingding);
                             System.out.println("更新该部门");
                         }
@@ -1597,7 +1607,7 @@ public class DingDingServiceImpl implements DingDingService {
                     }
                 }
                 //获取子部门的数据
-                getDepartmentList(roleId, roleName, companyId, corpid, access_token, departmentDingding.getDdDeptid(), addTempUserList);
+                getDepartmentList(roleId, roleName, companyId, corpid, access_token, departmentDingding.getDdDeptid(), addTempUserList, companyDingding);
             }
             //获取部门下的人员列表
             getDeptUserIdList(corpid, parentDeptId, access_token, addTempUserList);
@@ -1642,7 +1652,7 @@ public class DingDingServiceImpl implements DingDingService {
                     .setRoleId(defaultRole.getId())
                     .setRoleName(defaultRole.getRolename())
                     .setCompanyId(dingding.getCompanyId())
-                    .setName(userJson.getString("name"))
+                    .setName(dingding.getContactNeedTranslate() == 0?userJson.getString("name"):dingdingUserid)
                     .setDingdingUserid(dingdingUserid)
                     .setDingdingUnionid(userJson.getString("unionid"))
                     .setColor(ColorUtil.randomColor());
@@ -1710,7 +1720,12 @@ public class DingDingServiceImpl implements DingDingService {
             if (!addTempUserList.stream().anyMatch(add->add.getDingdingUserid().equals(dingdingUserid))) {
                 TempDuser duser = new TempDuser();
                 duser.setDingdingUserid(dingdingUserid);
-                duser.setName(userJson.getString("name"));
+                //用userId作为name,方便系统内部处理
+                if (userJson.getString("name") == null) {
+                    duser.setName(dingdingUserid);
+                } else {
+                    duser.setName(userJson.getString("name"));
+                }
                 duser.setDdDeptid(ddDeptId);
                 duser.setCorpid(corpid);
                 duser.setJobNumber(userJson.getString("job_number"));

+ 13 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/CompanyDingdingMapper.xml

@@ -27,5 +27,17 @@
     <sql id="Base_Column_List">
         corpid, corp_name, auth_user_id, indate, company_id, access_token, expire_time, agent_id, inner_appkey, inner_appsecret, inner_token, inner_expire_time, web_url, pc_web_url, oa_manager_dingid, sync_contact, contact_need_translate
     </sql>
-
+    <select id="getDingdingCompanyList" resultType="com.management.platform.entity.CompanyDingding">
+        select *
+        from company_dingding
+        left join company
+        ON company_dingding.company_id = company.id
+        where company.expiration_date >= now()
+        <if test="companyIds.size()>0">
+            and company.id in
+            <foreach collection="companyIds" item="item" separator="," open="(" close=")">
+                #{item}
+            </foreach>
+        </if>
+    </select>
 </mapper>

+ 6 - 2
fhKeeper/formulahousekeeper/timesheet/src/components/translationOpenData.vue

@@ -6,7 +6,7 @@
                 <ww-open-data :type='configuration.openType' :openid='translationValue'></ww-open-data>
             </span>
             <span v-else-if="dingdingPlatform && !noRender.includes(translationValue)">
-                <dt-open-data :open-type='configuration.openType' :open-id='translationValue'></dt-open-data>
+                <dt-open-data :open-type='dingdingOpenType[configuration.openType]' :open-id='translationValue'></dt-open-data>
             </span>
             <span v-else>{{ translationValue }}</span>
         </template>
@@ -54,7 +54,11 @@ export default {
                 renderIndex: 0,
             }, // 配置对象
 
-            noRender: ['全部人员', '未分配']
+            noRender: ['全部人员', '未分配'],
+            dingdingOpenType: {
+                userName: 'userName',
+                departmentName: 'deptName',
+            }
         }
     },
     computed: {},

+ 9 - 5
fhKeeper/formulahousekeeper/timesheet/src/components/translationOpenDataText.vue

@@ -1,11 +1,11 @@
 <template>
     <div class="translation">
         <!-- 文本 -->
-        <span v-if="corporateWeChat">
+        <span v-if="corporateWeChat && !noRender.includes(openIdValue)">
             <ww-open-data :type='type' :openid='openIdValue'></ww-open-data>
         </span>
-        <span v-else-if="dingdingPlatform">
-            <dt-open-data :open-type='type' :open-id='openIdValue'></dt-open-data>
+        <span v-else-if="dingdingPlatform && !noRender.includes(openIdValue)">
+            <dt-open-data :open-type='dingdingOpenType[type]' :open-id='openIdValue'></dt-open-data>
         </span>
         <span v-else>{{ openIdValue }}</span>
     </div>
@@ -32,7 +32,12 @@ export default {
             corporateWeChat: false, // 企业微信转译
             dingdingPlatform: false, // 钉钉转译
 
-            openIdValue: ''
+            openIdValue: '',
+            noRender: ['全部人员', '未分配'],
+            dingdingOpenType: {
+                userName: 'userName',
+                departmentName: 'deptName',
+            }
         }
     },
     computed: {},
@@ -49,7 +54,6 @@ export default {
     },
     methods: {
         dealWith() {
-            console.log(this.user)
             const { userNameNeedTranslate, dingdingUserid } = this.user
             if (userNameNeedTranslate) {
                 this.corporateWeChat = true

+ 2 - 0
fhKeeper/formulahousekeeper/timesheet_h5/public/index.html

@@ -9,6 +9,8 @@
     <link rel="shortcut icon" type="image/x-icon" href="./favicon.ico"/>
     <title>工时管家</title>
     <!-- <script src="/axios.min.js"></script> -->
+    <!--接入钉钉前端组件,进行通讯录组件展示-->
+    <script src="https://auth.dingtalk.com/opendata-1.1.0.js"></script>
     <link rel="stylesheet" href="https://at.alicdn.com/t/font_1456778_1mgn5degp7t.css">
     <!-- <script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js"></script> -->
     <!-- <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.25.0/axios.min.js"></script> -->

+ 9 - 4
fhKeeper/formulahousekeeper/timesheet_h5/src/components/translationOpenDataText.vue

@@ -1,11 +1,11 @@
 <template>
     <div class="translation">
         <!-- 文本 -->
-        <span v-if="corporateWeChat">
+        <span v-if="corporateWeChat && !noRender.includes(openIdValue)">
             <ww-open-data :type='type' :openid='openIdValue'></ww-open-data>
         </span>
-        <span v-else-if="dingdingPlatform">
-            <dt-open-data :open-type='type' :open-id='openIdValue'></dt-open-data>
+        <span v-else-if="dingdingPlatform && !noRender.includes(openIdValue)">
+            <dt-open-data :open-type='dingdingOpenType[type]' :open-id='openIdValue'></dt-open-data>
         </span>
         <span v-else>{{ openIdValue }}</span>
     </div>
@@ -33,7 +33,12 @@ export default {
             corporateWeChat: false, // 企业微信转译
             dingdingPlatform: false, // 钉钉转译
 
-            openIdValue: ''
+            openIdValue: '',
+            noRender: ['全部人员', '未分配'],
+            dingdingOpenType: {
+                userName: 'userName',
+                departmentName: 'deptName',
+            }
         }
     },
     computed: {},