ソースを参照

Merge branch 'master' of http://39.98.153.250:9080/bowintek/EmploymentSite

82064491C07A712AE32B5B57EC6EF136 3 ヶ月 前
コミット
d059ca5d30

+ 13 - 1
doc/待更新脚本.txt

@@ -38,4 +38,16 @@ alter table pc_signin add constraint FK_Pc_Signin_Ref_Site foreign key (SiteID)
  -- 2024-08-06 驿站工作人员外出地图菜单
  INSERT INTO sys_function_code VALUES ('T011004', '驿站工作人员外出地图', 'T0110', 4);
  INSERT INTO `sys_menu` VALUES ('T011004', 4, '驿站工作人员外出地图', NULL, 'views/dataMap/siteUserWorkDataMap', '/siteUserWorkDataMap', 'T0110', NULL, 0, 1, 1, 'T011004', 1, NULL, 1);
- insert into sys_role_sys_function_code (`RoleID`, `FunctionCode`) values('20afde90-a81a-11ed-a6c5-7085c2a9999e','T011004');
+ insert into sys_role_sys_function_code (`RoleID`, `FunctionCode`) values('20afde90-a81a-11ed-a6c5-7085c2a9999e','T011004');
+
+
+
+INSERT INTO  `sys_function_code` (`FunctionCode`, `FunctionName`, `ParentFunctionCode`, `OrderNo`) VALUES ('T010305', '外出服务管理', 'T0103', 5); INSERT INTO  `sys_function_code` (`FunctionCode`, `FunctionName`, `ParentFunctionCode`, `OrderNo`) VALUES ('T01030501', '查看', 'T010305', 1);
+INSERT INTO  `sys_function_code` (`FunctionCode`, `FunctionName`, `ParentFunctionCode`, `OrderNo`) VALUES ('T01030502', '编辑', 'T010305', 2);
+INSERT INTO  `sys_function_code` (`FunctionCode`, `FunctionName`, `ParentFunctionCode`, `OrderNo`) VALUES ('T01030503', '删除', 'T010305', 3);
+INSERT INTO  `sys_function_code` (`FunctionCode`, `FunctionName`, `ParentFunctionCode`, `OrderNo`) VALUES ('T01030504', '跟进', 'T010305', 4);
+
+
+INSERT INTO  `sys_menu` (`MenuNo`, `OrderNo`, `MenuName`, `Icon`, `ViewPath`, `Url`, `ParentMenuNo`, `Description`, `IsTopMenu`, `IsVisible`, `IsLeaf`, `FunctionCode`, `RecordStatus`, `ShortcutIcon`, `IsBlank`) VALUES ('T010305', 5, '外出服务管理', NULL, '', '/signinMgt', 'T0103', '外出服务管理', 0, 1, 1, 'T010305', 1, NULL, NULL);
+INSERT INTO  `sys_menu` (`MenuNo`, `OrderNo`, `MenuName`, `Icon`, `ViewPath`, `Url`, `ParentMenuNo`, `Description`, `IsTopMenu`, `IsVisible`, `IsLeaf`, `FunctionCode`, `RecordStatus`, `ShortcutIcon`, `IsBlank`) VALUES ('T01030501', 1, '外出服务信息', NULL, 'views/jobusermgr/signinMgt/index', '/index', 'T010305', '', 0, 0, 1, 'T010305', 1, NULL, NULL);
+INSERT INTO  `sys_menu` (`MenuNo`, `OrderNo`, `MenuName`, `Icon`, `ViewPath`, `Url`, `ParentMenuNo`, `Description`, `IsTopMenu`, `IsVisible`, `IsLeaf`, `FunctionCode`, `RecordStatus`, `ShortcutIcon`, `IsBlank`) VALUES ('T01030502', 1, '编辑外出服务', NULL, 'views/jobusermgr/signinMgt/edit', '/edit', 'T010305', '', 0, 0, 1, 'T010305', 1, NULL, NULL);

+ 106 - 0
src/main/java/com/hz/employmentsite/controller/jobUserManager/SigninMgtController.java

@@ -0,0 +1,106 @@
+package com.hz.employmentsite.controller.jobUserManager;
+
+import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.filter.exception.BaseErrorEnum;
+import com.hz.employmentsite.filter.exception.BaseException;
+import com.hz.employmentsite.filter.exception.BaseResponse;
+import com.hz.employmentsite.filter.exception.RespGenerstor;
+import com.hz.employmentsite.model.PcRecommendMgt;
+import com.hz.employmentsite.services.service.AccountService;
+import com.hz.employmentsite.services.service.jobUserManager.RecommendMgtService;
+import com.hz.employmentsite.services.service.jobUserManager.SigninMgtService;
+import com.hz.employmentsite.util.DateUtils;
+import com.hz.employmentsite.util.ExcelHelper;
+import com.hz.employmentsite.vo.jobUserManager.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@RequestMapping(value = "/api/jobusermgr/signinMgt")
+public class SigninMgtController {
+    @Autowired
+    private SigninMgtService signinMgtService;
+    @Autowired
+    private AccountService accountService;
+    @Autowired
+    private DateUtils dateUtils;
+
+    @ResponseBody
+    @GetMapping("/getList")
+    public BaseResponse getList(@RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize,
+                                @RequestParam(required = false) List<String> signinIDList,
+                                @RequestParam(required = false) String name, @RequestParam(required = false) String siteID,
+                                @RequestParam(required = false) String regionCode, @RequestParam(required = false) String signinType,
+                                @RequestParam(required = false) Date startDate, @RequestParam(required = false) Date endDate) {
+
+        PageInfo<SigninMgtVo> result = signinMgtService.getList(pageIndex, pageSize,signinIDList, name, siteID ,regionCode, signinType, startDate, endDate);
+        return RespGenerstor.success(result);
+    }
+
+    @ResponseBody
+    @GetMapping("/getListById")
+    public BaseResponse getListById(@RequestParam(required = false) String id) {
+        return RespGenerstor.success(signinMgtService.getDataById(id));
+    }
+
+    @GetMapping("/export")
+    public BaseResponse export(HttpServletResponse response, @RequestParam(required = false) Boolean isExport,
+                               @RequestParam("pageIndex") int pageIndex, @RequestParam("pageSize") int pageSize,
+                               @RequestParam(required = false) List<String> signinIDList,
+                               @RequestParam(required = false) String name, @RequestParam(required = false) String siteID,
+                               @RequestParam(required = false) String regionCode, @RequestParam(required = false) String signinType,
+                               @RequestParam(required = false) Date startDate, @RequestParam(required = false) Date endDate) throws Exception {
+        PageInfo<SigninMgtVo> result = signinMgtService.getList(pageIndex, pageSize, signinIDList, name, siteID, regionCode, signinType, startDate, endDate);
+        if (isExport == null || !isExport) {
+            return RespGenerstor.success(result);
+        } else {
+            ExcelHelper excelHelper = new ExcelHelper();
+            ExcelHelper.ExcelData data = excelHelper.new ExcelData();
+            data.setTitles(Arrays.asList(new String[]{"序号", "外出人员", "外出时间", "所属县区", "所属驿站", "外出类型", "走访企业", "走访人员", "走访内容"}));
+            int i = 0;
+            List<List<Object>> rowDatas = new ArrayList();
+            for (SigninMgtVo item : result.getList()) {
+                List<Object> row = new ArrayList();
+                ++i;
+                row.add(i);
+                row.add(item.getSigninerName());
+                row.add(dateUtils.dateToStrFormat(item.getSigninTime(),"yyyy-MM-dd"));
+                row.add(item.getRegionName());
+                row.add(item.getSiteName());
+                row.add(item.getSigninTypeName());
+                row.add(item.getCompanyName());
+                row.add(item.getJobUserName());
+                row.add(item.getContent());
+                rowDatas.add(row);
+            }
+            data.setRows(rowDatas);
+            excelHelper.exportExcel(response, data);
+            return null;
+        }
+
+    }
+
+    @ResponseBody
+    @PostMapping("/delete")
+    public BaseResponse<Integer> deleteSigninMgt(HttpServletRequest request, @RequestBody List<String> ids) {
+        Integer result = signinMgtService.delete(request, ids);
+        if (result <= 0)
+            throw new BaseException(BaseErrorEnum.DELETE_NOT_DATA_ERROR);
+        return RespGenerstor.success(1);
+    }
+
+    @ResponseBody
+    @PostMapping("/save")
+    public BaseResponse<Integer> save(@RequestBody SigninMgtVo data) {
+        var result = signinMgtService.save(data, accountService.getLoginUserID());
+        return RespGenerstor.success(result);
+    }
+
+}

+ 17 - 0
src/main/java/com/hz/employmentsite/mapper/cquery/SigninMgtCQuery.java

@@ -0,0 +1,17 @@
+package com.hz.employmentsite.mapper.cquery;
+
+import com.hz.employmentsite.vo.jobUserManager.*;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+
+public interface SigninMgtCQuery {
+
+    List<SigninMgtVo> getSigninMgtList(@Param("signinIDList") String signinIDList,@Param("name") String name,@Param("siteID") String siteID,
+                                       @Param("regionCode") String regionCode,@Param("signinType") String signinType,
+                                       @Param("startDate") Date startDate,@Param("endDate") Date endDate);
+
+
+}

+ 100 - 0
src/main/java/com/hz/employmentsite/services/impl/jobUserManager/SigninMgtServiceImpl.java

@@ -0,0 +1,100 @@
+package com.hz.employmentsite.services.impl.jobUserManager;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.mapper.PcSigninMapper;
+import com.hz.employmentsite.mapper.cquery.SigninMgtCQuery;
+import com.hz.employmentsite.model.*;
+import com.hz.employmentsite.services.service.jobUserManager.SigninMgtService;
+import com.hz.employmentsite.util.StringUtils;
+import com.hz.employmentsite.vo.jobUserManager.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+@Service("SigninMgtService")
+@Slf4j
+public class SigninMgtServiceImpl implements SigninMgtService {
+
+    @Autowired
+    private SigninMgtCQuery signinMgtCQuery;
+
+    @Autowired
+    private PcSigninMapper signinMapper;
+
+    @Autowired
+    private StringUtils stringUtils;
+
+    @Override
+    public PageInfo<SigninMgtVo> getList(Integer page, Integer rows, List<String> signinIDList,String name,
+                                         String siteID, String regionCode, String signinType,
+                                         Date startDate, Date endDate ) {
+        PageHelper.startPage(page, rows);
+        List<SigninMgtVo> list = signinMgtCQuery.getSigninMgtList(stringUtils.ListToInSql(signinIDList),name, siteID, regionCode, signinType,startDate, endDate);
+
+        PageInfo<SigninMgtVo> result = new PageInfo(list);
+
+        return result;
+    }
+    @Override
+    public SigninMgtVo getDataById(String id) {
+
+        if (stringUtils.IsNullOrEmpty(id)) {
+            return null;
+        }
+        SigninMgtVo data = signinMgtCQuery.getSigninMgtList(stringUtils.ListToInSql(Arrays.asList(id)), null, null, null,   null, null,null).stream().findFirst().orElse(null);
+        return data;
+    }
+
+    @Override
+    public int delete(HttpServletRequest request, List<String> ids) {
+        int result = 0;
+        for(String curSigninID: ids){
+            int count = signinMapper.deleteByPrimaryKey(curSigninID);
+            result+=count;
+        }
+        return result;
+    }
+
+    @Override
+    public int save(SigninMgtVo data, String userId) {
+        int result = 0;
+        PcSignin dbData = signinMapper.selectByPrimaryKey(data.getSigninId());
+        if (dbData == null) {
+                dbData = new PcSignin();
+                dbData.setSiteID(data.getSiteID());
+                dbData.setSigninType(data.getSigninType());
+                dbData.setCompanyID(data.getCompanyID());
+                dbData.setJobuserID(data.getJobuserID());
+                dbData.setSigninTime(data.getSigninTime());
+                dbData.setContent(data.getContent());
+                dbData.setLongitude(data.getLongitude());
+                dbData.setLatitude(data.getLatitude());
+                dbData.setRecordStatus(1);
+                dbData.setCreateTime(new Date());
+                dbData.setCreateUserID(userId);
+                result = signinMapper.insert(dbData);
+        }
+        else {
+            dbData.setSigninId(data.getSigninId());
+            dbData.setSiteID(data.getSiteID());
+            dbData.setSigninType(data.getSigninType());
+            dbData.setCompanyID(data.getCompanyID());
+            dbData.setJobuserID(data.getJobuserID());
+            dbData.setSigninTime(data.getSigninTime());
+            dbData.setContent(data.getContent());
+            dbData.setLongitude(data.getLongitude());
+            dbData.setLatitude(data.getLatitude());
+            dbData.setRecordStatus(data.getRecordStatus());
+            dbData.setModifyTime(new Date());
+            dbData.setModifyUserID(userId);
+            result = signinMapper.updateByPrimaryKeyWithBLOBs(dbData);
+        }
+        return result;
+    }
+
+
+}

+ 21 - 0
src/main/java/com/hz/employmentsite/services/service/jobUserManager/SigninMgtService.java

@@ -0,0 +1,21 @@
+package com.hz.employmentsite.services.service.jobUserManager;
+
+import com.github.pagehelper.PageInfo;
+import com.hz.employmentsite.vo.jobUserManager.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.List;
+
+public interface SigninMgtService {
+    PageInfo<SigninMgtVo> getList(Integer page, Integer rows, List<String> signinIDList,String name,
+                                  String siteID, String regionCode, String signinType,
+                                  Date startDate,Date endDate);
+
+
+    SigninMgtVo getDataById(String id);
+
+    int delete(HttpServletRequest request, List<String> ids);
+
+    int save(SigninMgtVo data, String userId);
+}

+ 27 - 0
src/main/java/com/hz/employmentsite/vo/jobUserManager/SigninMgtVo.java

@@ -0,0 +1,27 @@
+package com.hz.employmentsite.vo.jobUserManager;
+
+import com.hz.employmentsite.model.PcRecommendMgt;
+import com.hz.employmentsite.model.PcSignin;
+import com.hz.employmentsite.util.datarange.annotations.InstitutionID;
+import com.hz.employmentsite.util.datarange.annotations.RegionID;
+import com.hz.employmentsite.util.datarange.annotations.SiteID;
+import lombok.Data;
+
+@Data
+public class SigninMgtVo extends PcSignin {
+    public String SiteName;
+    public String RegionCode;
+    public String RegionName;
+    public String CompanyName;
+    public String JobUserName;
+    public String SigninerName;
+    public String SigninTypeName;
+
+    // 数据权限
+    @SiteID
+    private String siteID;
+    @InstitutionID
+    public String institutionID;
+    @RegionID
+    private String regionCode;
+}

+ 47 - 0
src/main/resources/mapping/cquery/SigninMgtCQuery.xml

@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.hz.employmentsite.mapper.cquery.SigninMgtCQuery">
+    <select id="getSigninMgtList" resultType="com.hz.employmentsite.vo.jobUserManager.SigninMgtVo">
+        select a.signinId,a.siteId,a.signinType,a.companyId,a.jobUserId,a.signinTime,a.content,a.longitude,a.latitude,a.recordStatus,a.createUserId,a.createTime,
+        a.modifyuserId,a.modifyTime,site.SiteName,site.RegionCode,area.name as regionName, company.CompanyName,jobuser.Name as JobUserName,
+        siteuser.SiteUserName as signinerName,dic1.Name as signinTypeName
+        from pc_signin a
+        left join pc_site site on a.SiteID = site.SiteID
+        left join area_code area on site.regionCode = area.code
+        left join pc_company company on a.CompanyID = company.CompanyID
+        left join pc_jobuser jobuser on a.JobUserID = jobuser.JobuserID
+        left join pc_site_user siteuser on a.CreateUserID = siteuser.UserID
+        left join (select `Value`,`Name` from sys_dictionary_item where DictionaryCode='SigninType') dic1
+        on a.signinType = dic1.`Value`
+        <where>
+            <if test="signinIDList != '' and signinIDList != null">
+                and a.SigninID in (${signinIDList})
+            </if>
+            <if test="name != '' and name != null">
+                and siteuser.SiteUserName like Concat('%',#{name},'%')
+            </if>
+            <if test="siteID != null and siteID != ''">
+                and a.SiteID = #{siteID}
+            </if>
+            <if test="signinType != '' and signinType != null">
+                and a.SigninType = #{signinType}
+            </if>
+
+            <if test="regionCode != '' and regionCode != null">
+                and site.RegionCode = #{regionCode}
+            </if>
+            <if test="startDate != null and endDate == null">
+                and Date(a.SigninTime) <![CDATA[ >= ]]> Date(#{startDate})
+            </if>
+            <if test="endDate != null and startDate == null">
+                and Date(a.SigninTime) <![CDATA[ <= ]]> Date(#{endDate})
+            </if>
+            <if test="startDate != null and endDate != null">
+                and Date(a.SigninTime) <![CDATA[ >= ]]> Date(#{startDate})
+                and Date(a.SigninTime) <![CDATA[ <= ]]> Date(#{endDate})
+            </if>
+        </where>
+        order by a.createtime desc
+    </select>
+
+</mapper>

+ 52 - 0
vue/src/api/jobUserManager/signinMgt/index.ts

@@ -0,0 +1,52 @@
+import {request} from '@/utils/request';
+
+export function getList(query: any) {
+  return request(
+    {
+      url: 'jobusermgr/signinMgt/getList',
+      method: 'get',
+      params: query,
+    },
+    {isNew: true},
+  );
+}
+
+export function getDataById(id: any){
+  return request(
+    {
+      url: 'jobusermgr/signinMgt/getListById',
+      method: 'get',
+      params: {id},
+    },
+    {isNew: true},
+  );
+}
+
+export function del(data: any) {
+  return request({
+      url: 'jobusermgr/signinMgt/delete',
+      method: 'post',
+      data: data
+    },
+    {
+      isNew: true,
+      successMsg: '删除成功!',
+      errorMsg: '删除失败!'
+    }
+  )
+}
+
+
+export function save(data: any) {
+  return request({
+      url: 'jobusermgr/signinMgt/save',
+      method: 'post',
+      data: data
+    },
+    {
+      isNew: true,
+      successMsg: '提交成功!',
+      errorMsg: '提交失败!'
+    }
+  )
+}

+ 2 - 0
vue/src/router/asyncModules/jobUserManager.ts

@@ -10,6 +10,8 @@ export default {
   'views/jobusermgr/jobhunt/recommend': () => import('@/views/jobUserManager/jobhunt/recommend.vue'),
   'views/jobusermgr/recommend/index': () => import('@/views/jobUserManager/recommend/index.vue'),
   'views/jobusermgr/recommendMgt/index': () => import('@/views/jobUserManager/recommendMgt/index.vue'),
+  'views/jobusermgr/signinMgt/index': () => import('@/views/jobUserManager/signinMgt/index.vue'),
+  'views/jobusermgr/signinMgt/edit': () => import('@/views/jobUserManager/signinMgt/edit.vue'),
   'views/jobFairs/index': () => import('@/views/jobUserManager/jobFair/index.vue'),
   'views/jobFairs/add': () => import('@/views/jobUserManager/jobFair/edit.vue'),
   'views/jobFairs/edit': () => import('@/views/jobUserManager/jobFair/edit.vue'),

+ 4 - 0
vue/src/views/dataScreen/html/css/style.css

@@ -411,6 +411,10 @@
   animation: imagesLoop 15s linear 1s infinite normal;
 }
 
+.chart-box:hover .text-list {
+  animation-play-state: paused;
+}
+
 .text-list-item {
   width: 100%;
   height: 48px;

+ 314 - 0
vue/src/views/jobUserManager/signinMgt/edit.vue

@@ -0,0 +1,314 @@
+<template>
+  <div class="card-edit">
+    <a-form :model="dataModel" autocomplete="off" @finish="onFinish">
+      <a-divider orientation="left">编辑外出服务</a-divider>
+      <a-row :gutter="24">
+        <a-col :span="8">
+          <a-form-item label="姓名" :label-col="{ span: 6 }"
+                       name="signinerName" :rules="[{ required: true, message: '请输入姓名!' }]">
+            <a-input v-model:value="dataModel.signinerName" placeholder=""  :disabled="true"/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="所属驿站" :label-col="{span:6}" name="siteID"
+                       :rules="[{ required: true, message: '请选择所属驿站!' }]">
+            <a-select
+              ref="select"
+              v-model:value="dataModel.siteID"
+              :options="siteList"
+              :field-names="{ label: 'siteName', value: 'siteID' }"
+              :allow-clear="true"
+              @change="siteChange"
+            >
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+
+          <a-form-item label="所属县区" :label-col="{span:6}"
+                       name="regionCode" :rules="[{ required: true, message: '请选择所属县区!' }]">
+            <a-select
+              ref="select"  :disabled="true"
+              v-model:value="dataModel.regionCode"
+              :options="regionList"
+              :field-names="{ label: 'name', value: 'code' }"
+              :allow-clear="true"
+              @change="loadData"
+            >
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item  label="外出类型" :label-col="{ span: 6 }"
+                        name="signinType"  :rules="[{ required: true, message: '请选择外出类型!' }]">
+            <a-select
+              ref="select"
+              v-model:value="dataModel.signinType"
+              :options="signinTypeList"
+              :field-names="{ label: 'name', value: 'value' }"
+              :allow-clear="true"
+            >
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8">
+          <a-form-item label="外出时间" :label-col="{ span: 6 }" name="signinTime"
+                       :rules="[{ required: true, message: '请选择外出时间!' }]">
+            <a-date-picker
+              v-model:value="dataModel.signinTime"
+              picker="date"
+              value-format="YYYY-MM-DD"/>
+          </a-form-item>
+        </a-col>
+        <a-col :span="8" v-if="dataModel.signinType==1">
+          <a-form-item label="走访企业" :label-col="{span:6}" name="companyName"
+                       :rules="[{ required: true, message: '请选择走访企业!' }]">
+            <a-auto-complete
+              v-model:value="dataModel.companyName"
+              :options="companyList"
+              @search="selectCompanyList"
+              @change="companyChange"
+              :field-names="{
+                            value:'companyName',
+                          }"
+            >
+              <template #option="item">
+                <span v-html="formatStr1(item.companyName,false)"></span>
+              </template>
+            </a-auto-complete>
+          </a-form-item>
+        </a-col>
+
+        <a-col :span="8" v-if="dataModel.signinType==2">
+          <a-form-item label="走访人员" :label-col="{span:6}" name="jobUserName"
+                       :rules="[{ required: true, message: '请选择走访人员!' }]">
+            <a-auto-complete
+              v-model:value="dataModel.jobUserName"
+              :options="jobUserList"
+              @search="selectJobUserList"
+              @change="jobUserChange"
+              :field-names="{
+                            value:'name',
+                          }"
+            >
+              <template #option="item">
+                <span v-html="formatStr2(item.name,false)"></span>
+              </template>
+            </a-auto-complete>
+          </a-form-item>
+        </a-col>
+      </a-row>
+
+      <a-row :gutter="24">
+        <a-divider orientation="left">走访内容</a-divider>
+          <a-col :span="24">
+              <a-textarea :auto-size="{ minRows: 4, maxRows: 10 }"  v-model:value="dataModel.content"  placeholder="走访内容" :rows="4"/>
+          </a-col>
+        <a-col :span="8">
+
+        </a-col>
+      </a-row>
+
+      <a-form-item class="buttom-btns">
+        <a-button @click="onClose">取消</a-button>
+        <a-button type="primary" html-type="submit">提交</a-button>
+      </a-form-item>
+    </a-form>
+  </div>
+</template>
+
+<script lang="ts">
+import {defineComponent, reactive, ref, toRefs} from 'vue';
+import type {SelectProps} from 'ant-design-vue';
+import {useTabsViewStore} from '@/store/modules/tabsView';
+import BUploadFile from '@/components/file/uploadFile.vue';
+import {get} from "@/api/common";
+import {getSysDictionaryList} from '@/api/system/dictionary';
+import {getDataById,save} from '@/api/jobUserManager/signinMgt';
+import {getSiteByID, getSiteList} from "@/api/baseSettings/siteInfo";
+import SelectLabel from "@/views/baseSettings/label/selectLabel.vue";
+import {getAddressLonLat} from "@/utils/position";
+import {getList} from "@/api/companyService/company";
+import {getJobUserDataList} from "@/api/jobUserManager/jobuser";
+
+interface FormState {
+  dataModel: any;
+}
+
+export default defineComponent(
+  {
+    components: {BUploadFile,SelectLabel},
+    setup() {
+      const refSelectModel = ref();
+      const formState = reactive<FormState>({dataModel: {}});
+      const formTableState = reactive({loading: false});
+      const siteList = ref<any>([]);
+      const regionList = ref<SelectProps['options']>();
+      const signinTypeList = ref<SelectProps['options']>();
+      const companyList = ref<Array<any>>([]);
+      const jobUserList = ref<Array<any>>([]);
+      const selectCompanyList = (companyName: string) => {
+        if (companyName) {
+          getList({
+            pageIndex: 1,
+            pageSize: 30,
+            companyName,
+          }).then((result: any) => {
+            companyList.value = result.list;
+            setCompanyId(companyName);
+          })
+        }
+      }
+      const selectJobUserList = (jobUserName: string) => {
+        if (jobUserName) {
+          getJobUserDataList({
+            pageIndex: 1,
+            pageSize: 30,
+            jobUserName,
+          }).then(data => {
+            jobUserList.value = data.list;
+            setJobUserId(jobUserName);
+            console.log("jobUserList",jobUserList.value);
+          })
+        }
+      }
+      const formatStr1 = (str: any, isPostName) => {
+        if (!str) {
+          return "";
+        }
+        if (isPostName) {
+          return str.replace(formState.dataModel.professionName, '<span style="color: coral">' + formState.dataModel.professionName + '</span>');
+        }
+        return str.replace(formState.dataModel.companyName, '<span style="color: coral">' + formState.dataModel.companyName + '</span>');
+      }
+      const formatStr2 = (str: any,isProfessionName:boolean) => {
+        if (!str) {
+          return "";
+        }
+        if(!isProfessionName){
+          return str.replace(formState.dataModel.jobUserName, '<span style="color: coral">' + formState.dataModel.jobUserName + '</span>');
+        }
+        return str.replace(formState.dataModel.professionName, '<span style="color: coral">' + formState.dataModel.professionName + '</span>');
+      }
+      function companyChange(value: any) {
+        formState.dataModel.companyName = value;
+        setCompanyId(value);
+      }
+      function jobUserChange(value: any) {
+        formState.dataModel.name = value;
+        setJobUserId(value);
+      }
+      function setCompanyId(value: any) {
+        const company = companyList.value.find(x => x.companyName === value);
+        if (company) {
+          formState.dataModel.companyID = company.companyID;
+        } else {
+          formState.dataModel.companyID = null;
+        }
+      }
+      function setJobUserId(value:any){
+        const curJobUser = jobUserList.value.find(x => x.name === value);
+        if (curJobUser) {
+          formState.dataModel.jobUserID = curJobUser.jobUserID;
+        } else {
+          formState.dataModel.jobUserID = null;
+        }
+      }
+      const educationData = ref([]);
+      const tabsViewStore = useTabsViewStore();
+
+      const getSigninTypeList = () => {
+        getSysDictionaryList('SigninType').then((data) => {
+          signinTypeList.value = data;
+        });
+      };
+
+      const getAllSites = () => {
+        getSiteList({pageIndex:1,pageSize:9999}).then((result :any) => {
+          siteList.value = result.list;
+        })
+      }
+
+      get('system/area/getCityList', {}).then(data => {
+        regionList.value = data;
+      });
+
+
+      const onClose = (reload: any) => {
+        tabsViewStore.closeCurrentTabByPath('/jobusermgr/signinMgt/edit');
+        tabsViewStore.openTab('/jobusermgr/signinMgt/index', {reload: reload});
+      };
+
+      const onFinish = () => {
+        console.log("sfs",formState.dataModel);
+        save(formState.dataModel).then((result) => {
+          if (result) {
+            onClose(1)
+          }
+        },() => {
+        });
+      }
+
+
+      const loadData = (id: any) => {
+        getAllSites();
+        getSigninTypeList();
+        getDataById(id).then(data => {
+          formState.dataModel = data;
+          console.log("sfs",formState.dataModel);
+        });
+      };
+
+
+
+      // 所属驿站变更关联区县
+      const siteChange = async function () {
+        const curSiteData: any = await getSiteByID(formState.dataModel.siteID);
+        formState.dataModel.regionCode = curSiteData.regionCode;
+      }
+
+      // 根据地址获取经纬度
+      function addressChange() {
+        if (formState.dataModel.address) {
+          getAddressLonLat(formState.dataModel.address).then((result: any) => {
+            if (result.lon && result.lat) {
+              formState.dataModel.longitude = result.lon;
+              formState.dataModel.latitude = result.lat;
+            }
+          });
+        }
+      }
+
+      return {
+        ...toRefs(formState),
+        loadData,
+        onClose,
+        onFinish,
+        siteChange,
+        refSelectModel,
+        siteList,
+        regionList,
+        companyList,
+        jobUserList,
+        formState,
+        educationData,
+        formTableState,
+        signinTypeList,
+        formatStr1,
+        formatStr2,
+        getSigninTypeList,
+        selectCompanyList,
+        selectJobUserList,
+        companyChange,
+        jobUserChange,
+        addressChange,
+
+      }
+    },
+    created() {
+      const id = history.state.params?.id;
+      this.loadData(id);
+    }
+  })
+</script>
+

+ 338 - 0
vue/src/views/jobUserManager/signinMgt/index.vue

@@ -0,0 +1,338 @@
+<template>
+  <div class="card-search">
+    <a-form
+      ref="formRef"
+      name="advanced_search"
+      class="ant-advanced-search-form"
+      :model="searchParamsState"
+    >
+      <a-row :gutter="24">
+          <a-col :span="6">
+            <a-form-item label="姓名" :label-col="{ span: 8 }" name="name">
+              <a-input v-model:value="searchParamsState.name" placeholder="" :allow-clear="true" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item label="所属县区" :label-col="{span:8}" name="regionCode">
+              <a-select
+                ref="select"
+                v-model:value="searchParamsState.regionCode"
+                :options="regionList"
+                :field-names="{ label: 'name', value: 'code' }"
+                :allow-clear="true"
+                @change="loadData"
+              >
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item label="所属驿站" :label-col="{ span: 8 }" name="siteID">
+              <a-select
+                ref="select"
+                v-model:value="searchParamsState.siteID"
+                :options="siteList"
+                :field-names="{ label: 'siteName', value: 'siteID' }"
+                :allow-clear="true"
+                @change="loadData"
+              >
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="6" style="text-align: center;">
+            <a-button type="primary" html-type="submit" @click="onFinish">查询</a-button>
+          </a-col>
+      </a-row>
+      <a-row :gutter="24" >
+        <a-col :span="6">
+          <a-form-item label="外出类型" :label-col="{ span: 8 }" name="signinType">
+            <a-select
+              ref="select"
+              v-model:value="searchParamsState.signinType"
+              :options="signinTypeList"
+              :field-names="{ label: 'name', value: 'value' }"
+              :allow-clear="true"
+              @change="loadData"
+            >
+            </a-select>
+          </a-form-item>
+        </a-col>
+        <a-col :span="6">
+          <a-form-item label="外出时间" :label-col="{ span: 8 }" name="signinDate">
+            <a-range-picker v-model:value="signinDate" :placeholder="['开始日期', '结束日期']" format="YYYY-MM-DD"
+                            @change="onCreateTimeChange"/>
+          </a-form-item>
+        </a-col>
+
+        <a-col :span="6">
+
+        </a-col>
+
+        <a-col :span="6" style="text-align: center;">
+          <BExportExcel :title="'导出'" :filename="'企业信息'"
+                        :url="'jobusermgr/signinMgt/export'"
+                        :params="{...exportSearchParams, isExport: true, rows:10000,signinIDList:formState.selectedRowKeys.join(',')}"></BExportExcel>
+        </a-col>
+      </a-row>
+
+    </a-form>
+    <div class="search-result-list">
+      <a-table
+        :columns="columns"
+        :data-source="dataList"
+        :scroll="{ x: '100%', y: 500 }"
+        :pagination="pagination"
+        :loading="formState.loading"
+        :row-selection="{ selectedRowKeys: formState.selectedRowKeys, onChange: onSelectChange }"
+        :row-key="(record) => record.signinId"
+        bordered
+        @change="handleTableChange"
+      >
+        <template #bodyCell="{ column, text, record }">
+          <template v-if="column.key === 'operation'">
+            <div class="table-operation">
+              <a-button type="link" size="small" functioncode="T01030502"
+                        @click='onEdit(record)'>修改
+              </a-button>
+              <a-button type="link" size="small" functioncode="T01030503"
+                        @click='onDel(record)'>删除
+              </a-button>
+              <a-button type="link" size="small" functioncode="T01030504"
+                        @click='onForward(record)'>跟进
+              </a-button>
+            </div>
+          </template>
+        </template>
+      </a-table>
+    </div>
+  </div>
+</template>
+
+<script lang="ts">
+import {reactive, ref, computed, defineComponent, createVNode} from 'vue';
+import type {FormInstance, TableProps, SelectProps} from 'ant-design-vue';
+import {getList,del} from "@/api/jobUserManager/signinMgt";
+import {getSysDictionaryList} from '@/api/system/dictionary';
+import {getPaginationTotalTitle} from '@/utils/common';
+import dayjs from "dayjs";
+import {getSiteList} from "@/api/baseSettings/siteInfo";
+import {get} from "@/api/common";
+import BExportExcel from "@/components/basic/excel/exportExcel/exportExcel.vue";
+import ColumnsSetting from "@/components/common/ColumnsSetting.vue";
+import {message, Modal} from "ant-design-vue";
+import {ExclamationCircleOutlined} from "@ant-design/icons-vue";
+import {useTabsViewStore} from "@/store/modules/tabsView";
+
+export default defineComponent({
+  name: 'recommendMgtList',
+  components: {ColumnsSetting, BExportExcel},
+  setup() {
+    const expand = ref(false);
+    const modalRoleUserRef = ref();
+    const modalRoleEditRef = ref();
+    const modalAddRemarkRef = ref();
+    const formRef = ref<FormInstance>();
+    const searchParamsState = reactive({
+      pageIndex: 1,
+      pageSize: 20,
+      name: '',
+      siteID: null,
+      regionCode: null,
+      signinType: null,
+      startDate: null,
+      endDate: null
+    });
+    const exportSearchParams = computed(() => {
+      let data = JSON.parse(JSON.stringify(searchParamsState));
+      data.pageSize = formState.total;
+      return data;
+    })
+    const formState = reactive({
+      total: 0,
+      selectedRowKeys: [],
+      loading: false,
+    });
+    // 原始表格定义数据
+    const originalColumns = [
+      {
+        title: '序号',
+        align: 'center',
+        width: 80,
+        key: 'recommendMgtID',
+        customRender: (item) =>
+          `${searchParamsState.pageSize * (searchParamsState.pageIndex - 1) + item.index + 1}`, isDisabled: true
+      },
+      {title: '外出人员', dataIndex: 'signinerName', key: 'signinerName', align: "center"},
+      {
+        title: '外出时间', dataIndex: 'signinTime', key: 'signinTime', align: "center",
+        customRender: ({record}) => dayjs(record.signinTime).format('YYYY-MM-DD')
+      },
+      {title: '所属县区', dataIndex: 'regionName', key: 'regionName', align: "center"},
+      {title: '所属驿站', dataIndex: 'siteName', key: 'siteName', align: "center"},
+      {title: '外出类型', dataIndex: 'signinTypeName', key: 'signinTypeName', align: "center"},
+      {title: '走访企业', dataIndex: 'companyName', key: 'companyName', align: "center"},
+      {title: '走访人员', dataIndex: 'jobUserName', key: 'jobUserName', align: "center"},
+      {title: '走访内容', dataIndex: 'content', key: 'content', align: "center", isDefaultClose: false},
+      {title: '操作', key: 'operation', width: 150, align: 'center', isDisabled: true, isDefaultClose: true},
+    ];
+    // 响应式表格定义
+    const columns = ref<Array<any>>(originalColumns.filter(item => !item.isDefaultClose));
+    const siteList = ref<Array<any>>([]);
+    const regionList = ref<SelectProps['options']>();
+    const signinDate = ref([]);
+    const pagination = computed(() => ({
+      total: formState.total,
+      current: searchParamsState.pageIndex,
+      pageSize: searchParamsState.pageSize,
+      showSizeChanger: true,
+      showTotal: (total) => getPaginationTotalTitle(total),
+    }));
+
+    const dataList = ref([]);
+    const signinTypeList = ref<SelectProps['options']>();
+
+    const onSelectChange = (selectedRowKeys: any) => {
+      formState.selectedRowKeys = selectedRowKeys;
+    };
+
+    const handleTableChange: TableProps['onChange'] = (pag: {
+      pageSize: number;
+      current: number;
+    }) => {
+      searchParamsState.pageIndex = pag.current;
+      searchParamsState.pageSize = pag.pageSize;
+      loadData();
+    };
+
+    const onFinish = () => {
+      loadData();
+    };
+
+    const tabsViewStore = useTabsViewStore();
+    const onEdit = (item: any) => {
+      tabsViewStore.addTabByPath('/jobusermgr/signinMgt/edit', {id: item.signinId});
+    };
+
+    const onDel = (item: any) => {
+      formState.selectedRowKeys = [];
+      if (item) {
+        formState.selectedRowKeys.push(item.signinId as never)
+      }
+
+      if (formState.selectedRowKeys.length <= 0) {
+        message.warning('请选择需要删除的数据!');
+        return false;
+      }
+      Modal.confirm({
+        title: '确认删除选择的外出服务信息?',
+        icon: createVNode(ExclamationCircleOutlined),
+        content: '',
+        okText: '确认删除',
+        okType: 'danger',
+        okButtonProps: {},
+        cancelText: '取消',
+        onOk() {
+          del(formState.selectedRowKeys).then(() => {
+            loadData();
+          });
+        },
+        onCancel() {
+          formState.selectedRowKeys = [];
+        },
+      })
+    }
+
+    const onForward = (item:any) =>{
+      console.log(item)
+    }
+
+    function getAllSites() {
+      getSiteList({pageIndex: 1, pageSize: 9999}).then((result: any) => {
+        siteList.value = result.list;
+      })
+    }
+
+    function getAllRegion() {
+      get('system/area/getCityList', {}).then(data => {
+        regionList.value = data;
+      });
+    }
+
+    const loadData = async function () {
+      formState.loading = true;
+      const result: any = await getList(searchParamsState);
+
+      dataList.value = result.list;
+      console.log(dataList.value);
+      formState.total = result.total;
+      formState.loading = false;
+    };
+
+
+    const theModalClosed = (d) => {
+      if (d) {
+        loadData();
+      }
+    }
+
+    const getSigninTypeList = () => {
+      getSysDictionaryList('SigninType').then((data) => {
+        signinTypeList.value = data;
+      });
+    };
+
+    const onCreateTimeChange = (dateString) => {
+      signinDate.value = dateString;
+      searchParamsState.startDate = dateString ? dateString[0].format("YYYY-MM-DD") : '';
+      searchParamsState.endDate = dateString ? dateString[1].format("YYYY-MM-DD") : '';
+      loadData();
+    }
+
+    function columnsCheckSub(columnsKeys: Array<string>) {
+      columns.value = originalColumns.filter((item: any) => columnsKeys.includes(item.key));
+    }
+
+    return {
+      modalRoleUserRef,
+      modalRoleEditRef,
+      modalAddRemarkRef,
+      formRef,
+      loadData,
+      searchParamsState,
+      exportSearchParams,
+      formState,
+      columns,
+      originalColumns,
+      columnsCheckSub,
+      pagination,
+      dataList,
+      signinTypeList,
+      theModalClosed,
+      onSelectChange,
+      handleTableChange,
+      onFinish,
+      getSigninTypeList,
+      expand,
+      siteList,
+      regionList,
+      getAllSites,
+      getAllRegion,
+      signinDate,
+      onCreateTimeChange,
+      onEdit,
+      onDel,
+      onForward
+    };
+  },
+  created() {
+    this.loadData();
+    this.getSigninTypeList();
+    this.getAllSites();
+    this.getAllRegion();
+  },
+  activated() {
+    if (history.state.params?.reload) this.loadData();
+  },
+});
+</script>
+
+<style lang="less" scoped></style>