diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
index 75f4f18..cd27497 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TOperator.java
@@ -57,6 +57,8 @@
   private String foperid;
   @Column(name= "REALNAME",length = 16)
   private String realname;
+  @Column(name = "COMPANYID",length = 32)
+  private String companyId;
 
 
   @Transient
@@ -70,25 +72,27 @@
     this.opername = opername;
   }
 
-    public TOperator(String opercode, String opertype, String opername, String operpwd, String status, String sex, String mobile, String email, String opendate, String closedate, String regionid, String roleids, String foperid, String realname, Collection<? extends GrantedAuthority> authorities) {
-        this.opercode = opercode;
-        this.opertype = opertype;
-        this.opername = opername;
-        this.operpwd = operpwd;
-        this.status = status;
-        this.sex = sex;
-        this.mobile = mobile;
-        this.email = email;
-        this.opendate = opendate;
-        this.closedate = closedate;
-        this.regionid = regionid;
-        this.roleids = roleids;
-        this.foperid = foperid;
-        this.realname = realname;
-        this.authorities = authorities;
-    }
+  public TOperator(String operid, String opercode, String opertype, String opername, String operpwd, String status, String sex, String mobile, String email, String opendate, String closedate, String regionid, String roleids, String foperid, String realname, String companyId, Collection<? extends GrantedAuthority> authorities) {
+    this.operid = operid;
+    this.opercode = opercode;
+    this.opertype = opertype;
+    this.opername = opername;
+    this.operpwd = operpwd;
+    this.status = status;
+    this.sex = sex;
+    this.mobile = mobile;
+    this.email = email;
+    this.opendate = opendate;
+    this.closedate = closedate;
+    this.regionid = regionid;
+    this.roleids = roleids;
+    this.foperid = foperid;
+    this.realname = realname;
+    this.companyId = companyId;
+    this.authorities = authorities;
+  }
 
-    public String getOperid() {
+  public String getOperid() {
     return operid;
   }
 
@@ -247,4 +251,11 @@
     this.regionid = regionid;
   }
 
+  public String getCompanyId() {
+    return companyId;
+  }
+
+  public void setCompanyId(String companyId) {
+    this.companyId = companyId;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/CompanyBean.java b/src/main/java/com/supwisdom/dlpay/system/bean/CompanyBean.java
new file mode 100644
index 0000000..7e8063f
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/CompanyBean.java
@@ -0,0 +1,85 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class CompanyBean {
+    private String companyId;
+    private String companyName;
+    private String licenseId;
+    private String companyAddress;
+    private String legalPeople;
+    private String legalPeopleCardType;
+    private String legalPeopleCardId;
+    private String companyPhone;
+    private String remarks;
+
+    public String getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(String companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getCompanyName() {
+        return companyName;
+    }
+
+    public void setCompanyName(String companyName) {
+        this.companyName = companyName;
+    }
+
+    public String getLicenseId() {
+        return licenseId;
+    }
+
+    public void setLicenseId(String licenseId) {
+        this.licenseId = licenseId;
+    }
+
+    public String getCompanyAddress() {
+        return companyAddress;
+    }
+
+    public void setCompanyAddress(String companyAddress) {
+        this.companyAddress = companyAddress;
+    }
+
+    public String getLegalPeople() {
+        return legalPeople;
+    }
+
+    public void setLegalPeople(String legalPeople) {
+        this.legalPeople = legalPeople;
+    }
+
+    public String getLegalPeopleCardType() {
+        return legalPeopleCardType;
+    }
+
+    public void setLegalPeopleCardType(String legalPeopleCardType) {
+        this.legalPeopleCardType = legalPeopleCardType;
+    }
+
+    public String getLegalPeopleCardId() {
+        return legalPeopleCardId;
+    }
+
+    public void setLegalPeopleCardId(String legalPeopleCardId) {
+        this.legalPeopleCardId = legalPeopleCardId;
+    }
+
+    public String getCompanyPhone() {
+        return companyPhone;
+    }
+
+    public void setCompanyPhone(String companyPhone) {
+        this.companyPhone = companyPhone;
+    }
+
+    public String getRemarks() {
+        return remarks;
+    }
+
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/CompanyCheckBean.java b/src/main/java/com/supwisdom/dlpay/system/bean/CompanyCheckBean.java
new file mode 100644
index 0000000..03e5055
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/CompanyCheckBean.java
@@ -0,0 +1,110 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class CompanyCheckBean {
+    private String companyId;
+    private String companyName;
+    private String licenseId;
+    private String companyAddress;
+    private String legalPeople;
+    private String legalPeopleCardType;
+    private String legalPeopleCardId;
+    private String companyPhone;
+    private String remarks;
+    private String checkFlag;
+
+    public CompanyCheckBean() {
+    }
+
+    public CompanyCheckBean(String companyId, String companyName, String licenseId, String companyAddress, String legalPeople, String legalPeopleCardType, String legalPeopleCardId, String companyPhone, String remarks, String checkFlag) {
+        this.companyId = companyId;
+        this.companyName = companyName;
+        this.licenseId = licenseId;
+        this.companyAddress = companyAddress;
+        this.legalPeople = legalPeople;
+        this.legalPeopleCardType = legalPeopleCardType;
+        this.legalPeopleCardId = legalPeopleCardId;
+        this.companyPhone = companyPhone;
+        this.remarks = remarks;
+        this.checkFlag = checkFlag;
+    }
+
+    public String getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(String companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getCompanyName() {
+        return companyName;
+    }
+
+    public void setCompanyName(String companyName) {
+        this.companyName = companyName;
+    }
+
+    public String getLicenseId() {
+        return licenseId;
+    }
+
+    public void setLicenseId(String licenseId) {
+        this.licenseId = licenseId;
+    }
+
+    public String getCompanyAddress() {
+        return companyAddress;
+    }
+
+    public void setCompanyAddress(String companyAddress) {
+        this.companyAddress = companyAddress;
+    }
+
+    public String getLegalPeople() {
+        return legalPeople;
+    }
+
+    public void setLegalPeople(String legalPeople) {
+        this.legalPeople = legalPeople;
+    }
+
+    public String getLegalPeopleCardType() {
+        return legalPeopleCardType;
+    }
+
+    public void setLegalPeopleCardType(String legalPeopleCardType) {
+        this.legalPeopleCardType = legalPeopleCardType;
+    }
+
+    public String getLegalPeopleCardId() {
+        return legalPeopleCardId;
+    }
+
+    public void setLegalPeopleCardId(String legalPeopleCardId) {
+        this.legalPeopleCardId = legalPeopleCardId;
+    }
+
+    public String getCompanyPhone() {
+        return companyPhone;
+    }
+
+    public void setCompanyPhone(String companyPhone) {
+        this.companyPhone = companyPhone;
+    }
+
+    public String getRemarks() {
+        return remarks;
+    }
+
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+
+    public String getCheckFlag() {
+        return checkFlag;
+    }
+
+    public void setCheckFlag(String checkFlag) {
+        this.checkFlag = checkFlag;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/CompanyCheckMessageBean.java b/src/main/java/com/supwisdom/dlpay/system/bean/CompanyCheckMessageBean.java
new file mode 100644
index 0000000..30beafb
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/CompanyCheckMessageBean.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class CompanyCheckMessageBean {
+    String companyId;
+    String checkMessage;
+
+    public String getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(String companyId) {
+        this.companyId = companyId;
+    }
+
+    public String getCheckMessage() {
+        return checkMessage;
+    }
+
+    public void setCheckMessage(String checkMessage) {
+        this.checkMessage = checkMessage;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/CompanyController.java b/src/main/java/com/supwisdom/dlpay/system/controller/CompanyController.java
new file mode 100644
index 0000000..5d6c0b5
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/CompanyController.java
@@ -0,0 +1,425 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.bean.CompanyBean;
+import com.supwisdom.dlpay.system.bean.CompanyCheckBean;
+import com.supwisdom.dlpay.system.bean.CompanyCheckMessageBean;
+import com.supwisdom.dlpay.system.domain.TCompany;
+import com.supwisdom.dlpay.system.domain.TDictionaryId;
+import com.supwisdom.dlpay.system.page.Pagination;
+import com.supwisdom.dlpay.system.service.CompanyService;
+import com.supwisdom.dlpay.system.service.SystemService;
+import com.supwisdom.dlpay.util.RedisUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/company")
+public class CompanyController {
+    protected static Logger logger = LoggerFactory.getLogger(CompanyController.class);
+
+    @Autowired
+    CompanyService companyService;
+    @Autowired
+    SystemService systemService;
+
+    @RequestMapping("/companyindex")
+    public String companyindex(ModelMap model) {
+        return "system/company";
+    }
+
+    @RequestMapping("/companycheckindex")
+    public String companycheckindex(){
+        return "system/companyCheck";
+    }
+
+
+    /**
+     * 分页获取所有公司信息，或者自身所属公司信息
+     *
+     * @param pageNo
+     * @param pageSize
+     * @param companyName
+     * @param operUser
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/loadCompanyList")
+    public Map loadCompanyList(@RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                               @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+                               @RequestParam(value = "companyName", required = false, defaultValue = "") String companyName,
+                               @AuthenticationPrincipal TOperator operUser) {
+        Map map = new HashMap();
+        try {
+            String opertype = operUser.getOpertype();
+            Pagination page = null;
+            if (!StringUtil.isEmpty(opertype) && (opertype.equals("S") || opertype.equals("P"))) {
+                page = companyService.getSystemCompanyList(companyName, pageNo, pageSize);
+            } else {
+                page = companyService.getOperCompanyList(companyName, pageNo, pageSize, operUser.getOperid());
+            }
+            map.put("PageResult", page);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 保存公司信息
+     *
+     * @param postData
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/addCompany", method = {RequestMethod.POST})
+    public Map addCompany(@RequestBody CompanyBean postData) {
+        Map map = new HashMap();
+        try {
+            TCompany companyByName = companyService.getCompanyByName(postData.getCompanyName());
+            if (companyByName != null) {
+                map.put("errStr", "公司名称已经存在，请修改！");
+                return map;
+            }
+            TCompany company = new TCompany();
+            long companyId = RedisUtil.incr("seq_company");
+            company.setCompanyId(companyId + "");
+            company.setCompanyName(postData.getCompanyName());
+            company.setLicenseId(postData.getLicenseId());
+            company.setCompanyAddress(postData.getCompanyAddress());
+            company.setLegalPeople(postData.getLegalPeople());
+            company.setLegalPeopleCardType(postData.getLegalPeopleCardType());
+            company.setLegalPeopleCardId(postData.getLegalPeopleCardId());
+            company.setCompanyPhone(postData.getCompanyPhone());
+            company.setRemarks(postData.getRemarks());
+            //新注册公司需要审核  ---status设为2 checkFlag为0 注册
+            company.setStatus("2");
+            company.setCheckFlag("0");//审核注册
+            company.setCheckStatus("0");//待审核
+
+            companyService.saveCompany(company);
+            map.put("errStr", "");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr", "保存公司失败!");
+        }
+        return map;
+    }
+
+
+    /**
+     * 修改公司信息
+     *
+     * @param postData
+     * @return
+     */
+    @RequestMapping(value = "/updateCompany", method = {RequestMethod.POST})
+    @ResponseBody
+    public Map updateRegion(@RequestBody CompanyBean postData) {
+        Map map = new HashMap();
+        try {
+            if (postData == null) {
+                map.put("errStr", "请先选择公司，然后再修改！");
+                return map;
+            }
+            TCompany companyByName = companyService.getCompanyByNameAndId(postData.getCompanyName(), postData.getCompanyId());
+            if (companyByName != null) {
+                map.put("errStr", "公司名称已经存在，请修改！");
+                return map;
+            }
+            TCompany company = companyService.getCompanyAllStatusById(postData.getCompanyId());
+            company.setCompanyName(postData.getCompanyName());
+            company.setLicenseId(postData.getLicenseId());
+            company.setCompanyAddress(postData.getCompanyAddress());
+            company.setLegalPeople(postData.getLegalPeople());
+            company.setLegalPeopleCardType(postData.getLegalPeopleCardType());
+            company.setLegalPeopleCardId(postData.getLegalPeopleCardId());
+            company.setCompanyPhone(postData.getCompanyPhone());
+            company.setRemarks(postData.getRemarks());
+            //修改可把注销状态变为待定 需要再次审核
+            company.setStatus("2");
+
+            //编辑时,如公司原来注册审核未通过，则审核标志依然为注册--0
+            if (!company.getCheckFlag().equals("0")){
+                company.setCheckFlag("1");//审核修改
+            }
+
+            company.setCheckStatus("0");//待审核
+            //上次审核结果置为空
+            company.setCheckMessage("");
+
+            companyService.updateCompany(company);
+
+            map.put("errStr", "");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr", "公司修改失败!");
+        }
+        return map;
+    }
+
+
+    /**
+     * 删除公司
+     *
+     * @param companyId
+     * @return
+     */
+    @RequestMapping("/deleteCompany")
+    @ResponseBody
+    public Map deleteCompany(@RequestParam(value = "companyId") String companyId) {
+        Map map = new HashMap();
+        String message = "";
+        try {
+            List<TOperator> operByCompanyId = companyService.getOperByCompanyId(companyId);
+            if (operByCompanyId != null && operByCompanyId.size() > 0) {
+                message = "此公司已被绑定!";
+                map.put("message", message);
+                return map;
+            }
+            TCompany company = companyService.getCompanyAllStatusById(companyId);
+            //公司删除 需进行审核
+            company.setStatus("2");
+            company.setCheckFlag("2");//审核删除
+            company.setCheckStatus("0");//待审核
+            company.setCheckMessage("");//上次审核结果置为空
+
+            companyService.updateCompany(company);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            message = "删除公司出错!";
+        }
+        map.put("message", message);
+        return map;
+    }
+
+
+    /**
+     * 加载相应公司信息
+     *
+     * @param companyId
+     * @param operUser
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/loadCompanyForUpdate")
+    public Map loadCompanyForUpdate(@RequestParam(value = "companyId") String companyId,
+                                    @AuthenticationPrincipal TOperator operUser) {
+        Map map = new HashMap();
+        try {
+            TCompany company = companyService.getCompanyAllStatusById(companyId);
+            map.put("company", company);
+            List<TDictionaryId> dicts = systemService.findTDictionaryByType(30);//法定代表人证件类型
+            map.put("dicts", dicts);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+
+    /**
+     * 分页获取需要审核的公司信息
+     *
+     * @param pageNo
+     * @param pageSize
+     * @param companyName
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/loadCompanyCheckList")
+    public Map loadCompanyCheckList(@RequestParam(value = "pageNo", required = false, defaultValue = "1") int pageNo,
+                                    @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
+                                    @RequestParam(value = "companyName", required = false, defaultValue = "") String companyName) {
+        Map map = new HashMap();
+        try {
+            Pagination page = null;
+            page = companyService.getCheckCompanyList(companyName, pageNo, pageSize);
+            map.put("PageResult", page);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 公司审核通过
+     *
+     * @param companyId
+     * @param operUser
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping("/checkPass")
+    public Map checkPass(@RequestParam(value = "companyId") String companyId,
+                         @AuthenticationPrincipal TOperator operUser) {
+        Map map = new HashMap();
+        try {
+            //审核通过实质 修改公司状态为有效--1,审核状态为通过--1,审核标志为空
+            String message = "";
+            TCompany company = companyService.getCompanyAllStatusById(companyId);
+            if (!company.getCheckStatus().equals("0") && !company.getStatus().equals("2")) {
+                message = "该公司不需要审核！";
+                map.put("message", message);
+                return map;
+            }
+            //判断公司审核标志是否未删除
+            if (company.getCheckFlag().equals("2")){
+                company.setStatus("0");//删除是置为注销状态---0
+            }else {
+                company.setStatus("1");
+            }
+            company.setCheckStatus("1");
+            company.setCheckFlag("");
+            company.setCheckMessage("");
+            company.setCheckOperId(operUser.getOperid());
+
+            companyService.updateCompany(company);
+
+            map.put("message", message);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return map;
+    }
+
+    /**
+     * 批量通过审核公司
+     *
+     * @param companyCheckBeans
+     * @param operUser
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/batchCheckPass", method = {RequestMethod.POST})
+    public Map batchCheckPass(
+            @RequestBody CompanyCheckBean[] companyCheckBeans,
+            @AuthenticationPrincipal TOperator operUser) {
+        Map map = new HashMap();
+        try {
+            for (CompanyCheckBean checkBean : companyCheckBeans) {
+                String companyId = checkBean.getCompanyId();
+                TCompany company = companyService.getCheckCompanyById(companyId);
+                if (company != null) {
+                    //判断公司审核标志是否未删除
+                    if (company.getCheckFlag().equals("2")){
+                        company.setStatus("0");//删除是置为注销状态---0
+                    }else {
+                        company.setStatus("1");
+                    }
+                    company.setCheckStatus("1");
+                    company.setCheckFlag("");
+                    company.setCheckMessage("");
+                    company.setCheckOperId(operUser.getOperid());
+                    companyService.updateCompany(company);
+                }
+            }
+            map.put("result", "批量审核公司通过成功！");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("result", "批量审核公司通过失败！");
+            logger.error("批量审核公司通过失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+
+    /**
+     * 公司审核驳回
+     *
+     * @param postData
+     * @param operUser
+     * @return
+     */
+    @RequestMapping(value = "/checkFail", method = {RequestMethod.POST})
+    @ResponseBody
+    public Map checkFail(@RequestBody CompanyCheckMessageBean postData,
+                         @AuthenticationPrincipal TOperator operUser) {
+        Map map = new HashMap();
+        try {
+            if (postData == null) {
+                map.put("errStr", "请先选择公司，然后再进行审核！");
+                return map;
+            }
+            TCompany company = companyService.getCheckCompanyById(postData.getCompanyId());
+            if (company == null) {
+                map.put("errStr", "该公司不需要审核或不存在！");
+                return map;
+            }
+            //审核驳回实质 修改公司状态为待定--2,审核状态为驳回--2,审核标志为空
+            company.setStatus("2");
+            company.setCheckStatus("2");
+            //如果审核标志为注册 则驳回是 标志不置空
+            if (!company.getCheckFlag().equals("0")) {
+                company.setCheckFlag("");
+            }
+            company.setCheckMessage(postData.getCheckMessage());
+            company.setCheckOperId(operUser.getOperid());
+
+            companyService.updateCompany(company);
+
+            map.put("errStr", "");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("errStr", "公司审核驳回失败!");
+        }
+        return map;
+    }
+
+
+    /**
+     * 批量驳回公司审核
+     *
+     * @param companyCheckBeans
+     * @param operUser
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/batchCheckFail", method = {RequestMethod.POST})
+    public Map batchCheckFail(
+            @RequestBody CompanyCheckBean[] companyCheckBeans,
+            @AuthenticationPrincipal TOperator operUser) {
+        Map map = new HashMap();
+        try {
+            for (CompanyCheckBean checkBean : companyCheckBeans) {
+                String companyId = checkBean.getCompanyId();
+                TCompany company = companyService.getCheckCompanyById(companyId);
+                if (company != null) {
+                    company.setStatus("2");
+                    company.setCheckStatus("2");
+                    //如果审核标志为注册 则驳回是 标志不置空
+                    if (!company.getCheckFlag().equals("0")) {
+                        company.setCheckFlag("");
+                    }
+                    //批量驳回的审核结果都设为---批量驳回
+                    company.setCheckMessage("批量驳回");
+                    company.setCheckOperId(operUser.getOperid());
+                    companyService.updateCompany(company);
+                }
+            }
+            map.put("result", "批量审核公司成功！");
+        } catch (Exception e) {
+            e.printStackTrace();
+            map.put("result", "批量审核公司失败！");
+            logger.error("批量审核公司失败：" + e.getMessage());
+        }
+        return map;
+    }
+
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/CompanyDao.java b/src/main/java/com/supwisdom/dlpay/system/dao/CompanyDao.java
new file mode 100644
index 0000000..b4217f5
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/CompanyDao.java
@@ -0,0 +1,30 @@
+package com.supwisdom.dlpay.system.dao;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.system.domain.TCompany;
+import com.supwisdom.dlpay.system.page.Pagination;
+
+import java.util.List;
+
+public interface CompanyDao {
+
+    public Pagination getSystemCompanyList(String companyName, int pageNo, int pageSize);
+
+    public Pagination getOperCompanyList(String companyName,int pageNo,int pageSize,String operid);
+
+    public TCompany getCompanyByName(String companyName);
+
+    public boolean saveCompany(TCompany bean);
+
+    public TCompany getCompanyAllStatusById(String companyId);
+
+    public boolean updateCompany(TCompany bean);
+
+    public List<TOperator> getOperByCompanyId(String companyId);
+
+    public TCompany getCompanyByNameAndId(String companyName,String companyId);
+
+    public Pagination getCheckCompanyList(String companyName,int pageNo,int pageSize);
+
+    public TCompany getCheckCompanyById(String companyId);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/dao/impl/CompanyDaoImpl.java b/src/main/java/com/supwisdom/dlpay/system/dao/impl/CompanyDaoImpl.java
new file mode 100644
index 0000000..4bb78c4
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/dao/impl/CompanyDaoImpl.java
@@ -0,0 +1,259 @@
+package com.supwisdom.dlpay.system.dao.impl;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.dao.CompanyDao;
+import com.supwisdom.dlpay.system.domain.TCompany;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import javax.persistence.TypedQuery;
+import java.util.List;
+
+@Repository
+public class CompanyDaoImpl implements CompanyDao {
+
+    @PersistenceContext
+    EntityManager entityManager;
+
+    @Transactional
+    @Override
+    public Pagination getSystemCompanyList(String companyName, int pageNo, int pageSize) {
+        String sql = " select a.companyid,a.companyname,a.licenseid,a.companyaddress,a.legalpeople,a.legalpeoplecardtype," +
+                " a.legalpeoplecardid,a.companyphone,case when a.status='1' then '有效' when a.status='2' then '待定' else '注销' end status,a.remarks, " +
+                " case when a.checkstatus='0' then '待审核' when a.checkstatus='1' then '审核通过' else '审核驳回' end checkstatus," +
+                " a.checkmessage,a.checkoperid,a.checkflag " +
+                " from tb_company a where 1>0 ";
+        if (!StringUtil.isEmpty(companyName)){
+            sql += " and a.companyName like :companyName ";
+        }
+
+        sql += " order by a.companyid";
+
+        Query query = entityManager.createNativeQuery(sql, TCompany.class);
+        if(!StringUtil.isEmpty(companyName)){
+            query.setParameter("companyName", "%"+companyName+"%" );
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<TCompany> list = query.getResultList();
+        page.setList(list);
+        int totalCount = getSystemCompanyListCount(companyName);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    private int getSystemCompanyListCount(String companyName){
+        String sql = "select count(*) from TB_Company where 1>0 ";
+        if (!StringUtil.isEmpty(companyName)){
+            sql += " and companyName like :companyName ";
+        }
+        Query query = entityManager.createNativeQuery(sql);
+        if(!StringUtil.isEmpty(companyName)){
+            query.setParameter("companyName", "%"+companyName+"%" );
+        }
+        int cnt=0;
+        List list = query.getResultList();
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
+    @Transactional
+    @Override
+    public Pagination getOperCompanyList(String companyName, int pageNo, int pageSize, String operid) {
+        String sql = " select a.companyid,a.companyname,a.licenseid,a.companyaddress,a.legalpeople,a.legalpeoplecardtype, " +
+                " a.legalpeoplecardid,a.companyphone,case when a.status='1' then '有效' when a.status='2' then '待定' else '注销' end status,a.remarks, " +
+                " case when a.checkstatus='0' then '待审核' when a.checkstatus='1' then '审核通过' else '审核驳回' end checkstatus," +
+                " a.checkmessage,a.checkoperid,a.checkflag " +
+                " from tb_company a,tb_operator b where a.companyid = b.companyid and b.operid = :operid ";
+        if (!StringUtil.isEmpty(companyName)){
+            sql += " and a.companyName like :companyName ";
+        }
+
+        sql += " order by a.companyid";
+
+        Query query = entityManager.createNativeQuery(sql, TCompany.class);
+        query.setParameter("operid", operid);
+        if(!StringUtil.isEmpty(companyName)){
+            query.setParameter("companyName", "%"+companyName+"%" );
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<TCompany> list = query.getResultList();
+        page.setList(list);
+        int totalCount = getOperCompanyListCount(companyName,operid);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    private int getOperCompanyListCount(String companyName,String operid){
+        String sql = "select count(*) from tb_company a,tb_operator b where a.companyid = b.companyid and b.operid = :operid ";
+        if (!StringUtil.isEmpty(companyName)){
+            sql += " and companyName like :companyName ";
+        }
+        Query query = entityManager.createNativeQuery(sql);
+        query.setParameter("operid", operid);
+        if(!StringUtil.isEmpty(companyName)){
+            query.setParameter("companyName", "%"+companyName+"%" );
+        }
+        int cnt=0;
+        List list = query.getResultList();
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
+    @Transactional
+    @Override
+    public TCompany getCompanyByName(String companyName) {
+        String sql = "select a from TCompany a where a.companyName = :companyName ";
+        TypedQuery<TCompany> query = entityManager.createQuery(sql, TCompany.class);
+        query.setParameter("companyName", companyName );
+        List<TCompany> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean saveCompany(TCompany bean) {
+        boolean flag=false;
+        try {
+            entityManager.persist(bean);
+            flag=true;
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public TCompany getCompanyAllStatusById(String companyId) {
+        String sql = "select a from TCompany a where a.companyId = :companyId ";
+        TypedQuery<TCompany> query = entityManager.createQuery(sql, TCompany.class);
+        query.setParameter("companyId", companyId);
+        List<TCompany> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public boolean updateCompany(TCompany bean) {
+        boolean flag = false;
+        try {
+            entityManager.merge(bean);
+            flag = true;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return flag;
+    }
+
+    @Transactional
+    @Override
+    public List<TOperator> getOperByCompanyId(String companyId) {
+        String sql = "select a from TOperator a where a.status='normal' and a.companyId = :companyId ";
+        TypedQuery<TOperator> query = entityManager.createQuery(sql, TOperator.class);
+        query.setParameter("companyId", companyId);
+        List<TOperator> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list;
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public TCompany getCompanyByNameAndId(String companyName, String companyId) {
+        String sql = "select a from TCompany a where a.companyName = :companyName and a.companyId <>:companyId";
+        TypedQuery<TCompany> query = entityManager.createQuery(sql, TCompany.class);
+        query.setParameter("companyName", companyName );
+        query.setParameter("companyId",  companyId);
+        List<TCompany> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+
+    @Transactional
+    @Override
+    public Pagination getCheckCompanyList(String companyName, int pageNo, int pageSize) {
+        String sql = " select a.companyid,a.companyname,a.licenseid,a.companyaddress,a.legalpeople,a.legalpeoplecardtype," +
+                " a.legalpeoplecardid,a.companyphone,a.status,a.remarks,a.checkstatus,a.checkmessage,a.checkoperid," +
+                " case when a.checkflag='0' then '注册' when a.checkflag='1' then '修改' when a.checkflag='2' then '删除' else '无' end checkflag " +
+                " from tb_company a where a.status='2' and a.checkstatus='0' ";
+        if (!StringUtil.isEmpty(companyName)){
+            sql += " and a.companyName like :companyName ";
+        }
+
+        sql += " order by a.companyid";
+
+        Query query = entityManager.createNativeQuery(sql, TCompany.class);
+        if(!StringUtil.isEmpty(companyName)){
+            query.setParameter("companyName", "%"+companyName+"%" );
+        }
+        pageNo = pageNo <= 0 ? 1 : pageNo;
+        query.setFirstResult((pageNo - 1) * pageSize);
+        query.setMaxResults(pageSize);
+        Pagination page = new Pagination();
+        page.setPageNo(pageNo);
+        page.setPageSize(pageSize);
+        List<TCompany> list = query.getResultList();
+        page.setList(list);
+        int totalCount = getCheckCompanyListCount(companyName);
+        page.setTotalCount(totalCount);
+        return page;
+    }
+
+    private int getCheckCompanyListCount(String companyName){
+        String sql = "select count(*) from TB_Company a where a.status='2' and a.checkstatus='0' ";
+        if (!StringUtil.isEmpty(companyName)){
+            sql += " and companyName like :companyName ";
+        }
+        Query query = entityManager.createNativeQuery(sql);
+        if(!StringUtil.isEmpty(companyName)){
+            query.setParameter("companyName", "%"+companyName+"%" );
+        }
+        int cnt=0;
+        List list = query.getResultList();
+        if (list!=null && list.size()>0){
+            cnt = Integer.parseInt(list.get(0).toString());
+        }
+        return cnt;
+    }
+
+    @Transactional
+    @Override
+    public TCompany getCheckCompanyById(String companyId) {
+        String sql = "select a from TCompany a where a.companyId=:companyId and a.status='2' and a.checkStatus='0' ";
+        TypedQuery<TCompany> query = entityManager.createQuery(sql, TCompany.class);
+        query.setParameter("companyId", companyId);
+        List<TCompany> list = query.getResultList();
+        if (list!=null && list.size()>0){
+            return list.get(0);
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/domain/TCompany.java b/src/main/java/com/supwisdom/dlpay/system/domain/TCompany.java
new file mode 100644
index 0000000..a441f1b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/domain/TCompany.java
@@ -0,0 +1,172 @@
+package com.supwisdom.dlpay.system.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@Entity
+@Table(name = "TB_COMPANY")
+public class TCompany {
+    private String companyId;
+    private String companyName;
+    private String licenseId;
+    private String companyAddress;
+    private String legalPeople;
+    private String legalPeopleCardType;
+    private String legalPeopleCardId;
+    private String companyPhone;
+    private String status;
+    private String remarks;
+    private String checkFlag;
+    private String checkStatus;
+    private String checkMessage;
+    private String checkOperId;
+
+    public TCompany() {
+    }
+
+    public TCompany(String companyId, String companyName, String licenseId, String companyAddress, String legalPeople, String legalPeopleCardType, String legalPeopleCardId, String companyPhone, String status, String remarks, String checkFlag, String checkStatus, String checkMessage, String checkOperId) {
+        this.companyId = companyId;
+        this.companyName = companyName;
+        this.licenseId = licenseId;
+        this.companyAddress = companyAddress;
+        this.legalPeople = legalPeople;
+        this.legalPeopleCardType = legalPeopleCardType;
+        this.legalPeopleCardId = legalPeopleCardId;
+        this.companyPhone = companyPhone;
+        this.status = status;
+        this.remarks = remarks;
+        this.checkFlag = checkFlag;
+        this.checkStatus = checkStatus;
+        this.checkMessage = checkMessage;
+        this.checkOperId = checkOperId;
+    }
+
+    @Id
+    @Column(name = "COMPANYID", unique = true, nullable = false, length = 32)
+    public String getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(String companyId) {
+        this.companyId = companyId;
+    }
+
+    @Column(name="COMPANYNAME", length = 255)
+    public String getCompanyName() {
+        return companyName;
+    }
+
+    public void setCompanyName(String companyName) {
+        this.companyName = companyName;
+    }
+
+    @Column(name = "LICENSEID",length = 32)
+    public String getLicenseId() {
+        return licenseId;
+    }
+
+    public void setLicenseId(String licenseId) {
+        this.licenseId = licenseId;
+    }
+
+    @Column(name = "COMPANYADDRESS",length = 255)
+    public String getCompanyAddress() {
+        return companyAddress;
+    }
+
+    public void setCompanyAddress(String companyAddress) {
+        this.companyAddress = companyAddress;
+    }
+
+    @Column(name = "LEGALPEOPLE",length = 20)
+    public String getLegalPeople() {
+        return legalPeople;
+    }
+
+    public void setLegalPeople(String legalPeople) {
+        this.legalPeople = legalPeople;
+    }
+
+    @Column(name = "LEGALPEOPLECARDTYPE",length = 20)
+    public String getLegalPeopleCardType() {
+        return legalPeopleCardType;
+    }
+
+    public void setLegalPeopleCardType(String legalPeopleCardType) {
+        this.legalPeopleCardType = legalPeopleCardType;
+    }
+
+    @Column(name = "LEGALPEOPLECARDID",length = 60)
+    public String getLegalPeopleCardId() {
+        return legalPeopleCardId;
+    }
+
+    public void setLegalPeopleCardId(String legalPeopleCardId) {
+        this.legalPeopleCardId = legalPeopleCardId;
+    }
+
+    @Column(name = "COMPANYPHONE",length = 20)
+    public String getCompanyPhone() {
+        return companyPhone;
+    }
+
+    public void setCompanyPhone(String companyPhone) {
+        this.companyPhone = companyPhone;
+    }
+
+    @Column(name = "STATUS",length = 10)
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    @Column(name = "REMARKS",length = 255)
+    public String getRemarks() {
+        return remarks;
+    }
+
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+
+    @Column(name = "CHECKFLAG",length = 10)
+    public String getCheckFlag() {
+        return checkFlag;
+    }
+
+    public void setCheckFlag(String checkFlag) {
+        this.checkFlag = checkFlag;
+    }
+
+    @Column(name = "CHECKSTATUS",length = 10)
+    public String getCheckStatus() {
+        return checkStatus;
+    }
+
+    public void setCheckStatus(String checkStatus) {
+        this.checkStatus = checkStatus;
+    }
+
+    @Column(name = "CHECKMESSAGE",length = 255)
+    public String getCheckMessage() {
+        return checkMessage;
+    }
+
+    public void setCheckMessage(String checkMessage) {
+        this.checkMessage = checkMessage;
+    }
+
+    @Column(name = "CHECKOPERID",length = 32)
+    public String getCheckOperId() {
+        return checkOperId;
+    }
+
+    public void setCheckOperId(String checkOperId) {
+        this.checkOperId = checkOperId;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/CompanyService.java b/src/main/java/com/supwisdom/dlpay/system/service/CompanyService.java
new file mode 100644
index 0000000..e8f07fc
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/service/CompanyService.java
@@ -0,0 +1,52 @@
+package com.supwisdom.dlpay.system.service;
+
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.system.domain.TCompany;
+import com.supwisdom.dlpay.system.page.Pagination;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface CompanyService {
+    //分页获取系统管理员权限公司信息
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public Pagination getSystemCompanyList(String companyName,int pageNo,int pageSize);
+
+    //获取用户所属公司信息
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public Pagination getOperCompanyList(String companyName,int pageNo,int pageSize,String operid);
+
+    //根据名称获取公司信息
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public TCompany getCompanyByName(String companyName);
+
+    //保存公司信息
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean saveCompany(TCompany bean);
+
+    //根据id获取所有状态下的公司信息
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public TCompany getCompanyAllStatusById(String companyId);
+
+    //修改公司信息
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public boolean updateCompany(TCompany bean);
+
+    //根据公司id获取管理员
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public List<TOperator> getOperByCompanyId(String companyId);
+
+    //根据id和名称获取非本id的相同名称公司
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public TCompany getCompanyByNameAndId(String companyName,String companyId);
+
+    //分页获取需要审核的公司信息
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public Pagination getCheckCompanyList(String companyName,int pageNo,int pageSize);
+
+    //根据公司id获取需审核的公司
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class})
+    public TCompany getCheckCompanyById(String companyId);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/CompanyServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/CompanyServiceImpl.java
new file mode 100644
index 0000000..408229a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/CompanyServiceImpl.java
@@ -0,0 +1,68 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.framework.domain.TOperator;
+import com.supwisdom.dlpay.system.dao.CompanyDao;
+import com.supwisdom.dlpay.system.domain.TCompany;
+import com.supwisdom.dlpay.system.page.Pagination;
+import com.supwisdom.dlpay.system.service.CompanyService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class CompanyServiceImpl implements CompanyService {
+
+    @Autowired
+    CompanyDao companyDao;
+
+    @Override
+    public Pagination getSystemCompanyList(String companyName, int pageNo, int pageSize) {
+        return companyDao.getSystemCompanyList(companyName, pageNo, pageSize);
+    }
+
+    @Override
+    public Pagination getOperCompanyList(String companyName, int pageNo, int pageSize, String operid) {
+        return companyDao.getOperCompanyList(companyName, pageNo, pageSize, operid);
+    }
+
+    @Override
+    public TCompany getCompanyByName(String companyName) {
+        return companyDao.getCompanyByName(companyName);
+    }
+
+    @Override
+    public boolean saveCompany(TCompany bean) {
+        return companyDao.saveCompany(bean);
+    }
+
+    @Override
+    public TCompany getCompanyAllStatusById(String companyId) {
+        return companyDao.getCompanyAllStatusById(companyId);
+    }
+
+    @Override
+    public boolean updateCompany(TCompany bean) {
+        return companyDao.updateCompany(bean);
+    }
+
+    @Override
+    public List<TOperator> getOperByCompanyId(String companyId) {
+        return companyDao.getOperByCompanyId(companyId);
+    }
+
+    @Override
+    public TCompany getCompanyByNameAndId(String companyName, String companyId) {
+        return companyDao.getCompanyByNameAndId(companyName, companyId);
+    }
+
+    @Override
+    public Pagination getCheckCompanyList(String companyName, int pageNo, int pageSize) {
+        return companyDao.getCheckCompanyList(companyName, pageNo, pageSize);
+    }
+
+    @Override
+    public TCompany getCheckCompanyById(String companyId) {
+        return companyDao.getCheckCompanyById(companyId);
+    }
+}
diff --git a/src/main/resources/templates/system/company.html b/src/main/resources/templates/system/company.html
new file mode 100644
index 0000000..0a58e85
--- /dev/null
+++ b/src/main/resources/templates/system/company.html
@@ -0,0 +1,510 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">公司管理</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">系统中心</a>
+          <a><cite>公司管理</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div id="companyapp">
+            <el-form :inline="true" ref="companyform" :model="companyform" data-parsley-validate class="form-horizontal form-label-left">
+
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">公司名称:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="companyform.companyName" ></el-input>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <button type="button" class="btn btn-info" @click="query" id="company_qrybtn">查 询</button>
+                        <button class="btn btn-primary" type="button" @click="addCompany">注册公司</button>
+                    </div>
+                </div>
+            </el-form>
+
+            <template>
+                <el-table
+                        ref="singletable"
+                        :data="tableData"
+                        highlight-current-row
+                        @current-change="currRowChange"
+                        stripe
+                        max-height="2000"
+                        border
+                        style="width: 100%">
+                    <el-table-column
+                            sortable
+                            prop="companyId"
+                            label="公司编号"
+                            width="120">
+                    </el-table-column>
+                    <el-table-column
+                            prop="companyName"
+                            label="公司名称"
+                            width="200">
+                    </el-table-column>
+                    <el-table-column
+                            prop="licenseId"
+                            label="营业执照编号"
+                            width="170">
+                    </el-table-column>
+                    <el-table-column
+                            prop="companyAddress"
+                            label="公司地址"
+                            width="220">
+                    </el-table-column>
+                    <el-table-column
+                            prop="status"
+                            sortable
+                            label="状态"
+                            width="90">
+                        <template scope="scope">
+                            <el-tag :type="scope.row.status === '有效' ? 'success' : 'danger'" close-transition>
+                                {{scope.row.status}}
+                            </el-tag>
+                        </template>
+                    </el-table-column>
+                    <el-table-column
+                            prop="legalPeople"
+                            label="法定代表人"
+                            width="120">
+                    </el-table-column>
+                    <el-table-column
+                            prop="legalPeopleCardType"
+                            label="法定代表人证件类型"
+                            width="170"
+                            :formatter="cardTypeform">
+                    </el-table-column>
+                    <el-table-column
+                            prop="legalPeopleCardId"
+                            label="法定代表人证件号码"
+                            width="200">
+                    </el-table-column>
+                    <el-table-column
+                            prop="companyPhone"
+                            label="联系方式"
+                            width="170">
+                    </el-table-column>
+                    <el-table-column
+                            prop="checkStatus"
+                            label="审核状态"
+                            width="100">
+                    </el-table-column>
+                    <el-table-column
+                            prop="checkFlag"
+                            :formatter="checkFlagform"
+                            label="审核标志"
+                            width="100">
+                    </el-table-column>
+                    <el-table-column
+                            prop="checkMessage"
+                            label="审核结果"
+                            width="220">
+                    </el-table-column>
+                    <el-table-column
+                            prop="checkOperId"
+                            label="审核人"
+                            width="120">
+                    </el-table-column>
+                    <el-table-column
+                            prop="remarks"
+                            label="备注"
+                            width="180">
+                    </el-table-column>
+                    <el-table-column
+                            label="操作"
+                            width="130">
+                        <template scope="scope">
+                            <button type="button" class="btn btn-info btn-xs" title="编辑" @click="editCompany(scope.row.companyId)" v-if="scope.row.checkStatus!='待审核'">编辑</button>
+                            <button type="button" class="btn btn-danger btn-xs" title="删除" @click="delCompany(scope.row.companyId)" v-if="(scope.row.checkStatus=='审核通过' || scope.row.checkStatus=='审核驳回' || scope.row.status=='有效') && scope.row.status!='注销' ">删除</button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <div class="clearfix"></div>
+                <el-pagination
+                        @size-change="handleSizeChange"
+                        @current-change="currPageChange"
+                        :current-page="currPage"
+                        :page-sizes="[10, 20, 50, 100]"
+                        :page-size="pageSize"
+                        layout="prev, pager, next,sizes, jumper,total"
+                        :total="totSize">
+                </el-pagination>
+            </template>
+
+            <el-dialog :title="companytitile" :visible.sync="dialogFormVisible"  :modal-append-to-body='false' @close="closeDialog('companyDiaForm')">
+                <el-form ref="companyDiaForm" :model="companyDiaForm" :rules="rules" label-width="36%" >
+
+                    <el-form-item label="公司名称:" prop="companyName">
+                        <div class="el-col el-col-18">
+                            <div class="el-input" style="width: 187px;">
+                                <el-input v-model="companyDiaForm.companyName" maxlength="20">
+                                    <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                                </el-input>
+                            </div>
+                        </div>
+                    </el-form-item>
+
+                    <el-form-item label="营业执照编号:" prop="licenseId">
+                        <el-col :span="18">
+                            <div class="el-input" style="width: 187px;">
+                                <el-input v-model="companyDiaForm.licenseId" maxlength="32">
+                                    <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                                </el-input>
+                            </div>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="公司地址:" prop="companyAddress">
+                        <el-col :span="18">
+                            <el-input v-model="companyDiaForm.companyAddress"  style="width: 187px;" maxlength="60">
+                                <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="法定代表人:" prop="legalPeople">
+                        <el-col :span="18">
+                            <el-input v-model="companyDiaForm.legalPeople"  style="width: 187px;" maxlength="20">
+                                <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="法定代表人证件类型:" prop="legalPeopleCardType">
+                        <el-col :span="18">
+                            <el-select v-model="companyDiaForm.legalPeopleCardType"
+                                       style="width: 187px;" clearable
+                                       filterable
+                                       placeholder="请选择">
+                                <el-option
+                                        v-for="legalPeopleCardType in legalPeopleCardTypes"
+                                        :key="legalPeopleCardType.value"
+                                        :label="legalPeopleCardType.label"
+                                        :value="legalPeopleCardType.value">
+                                </el-option>
+                            </el-select>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="法定代表人证件号码:" prop="legalPeopleCardId">
+                        <el-col :span="18">
+                            <el-input v-model="companyDiaForm.legalPeopleCardId"  style="width: 187px;" maxlength="32">
+                                <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="公司联系方式:" prop="companyPhone">
+                        <el-col :span="18">
+                            <el-input v-model="companyDiaForm.companyPhone"  style="width: 187px;" maxlength="20">
+                                <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+
+                    <el-form-item label="备注:" prop="remarks">
+                        <el-col :span="18">
+                            <el-input v-model="companyDiaForm.remarks"  style="width: 187px;" maxlength="200">
+                                <i class="el-icon-edit el-input__icon" slot="icon" ></i>
+                            </el-input>
+                        </el-col>
+                    </el-form-item>
+
+
+                </el-form>
+                <div slot="footer" class="dialog-footer">
+                    <el-button @click="resetForm('companyDiaForm') ">取 消</el-button>
+                    <el-button type="primary" @click="saveCompany('companyDiaForm')">确 定</el-button>
+                </div>
+            </el-dialog>
+
+        </div>
+    </div>
+</div>
+
+<script>
+    var company_vue = new Vue({
+        el:'#companyapp',
+        data:{
+            tableData:[],
+            currPage: 1,
+            pageSize:10,
+            totSize:0,
+            currentRow: null,
+            companyform:{
+                companyName:''
+            },
+            legalPeopleCardTypes:[],
+            dialogFormVisible: false,
+            companyDiaForm:{
+                companyId:'',
+                companyName:'',
+                licenseId:'',
+                companyAddress:'',
+                legalPeople:'',
+                legalPeopleCardType:'',
+                legalPeopleCardId:'',
+                companyPhone:'',
+                remarks:''
+            },
+            rules:{
+                companyName:[
+                    {required:true,message:'请输入公司名称',trigger:'blur'},
+                    {min: 1, max: 20, message: '长度在 1 到 20 个字符', trigger: 'blur'}
+                ],
+                licenseId: [
+                    {required: true, message: '请输入营业执照编号', trigger: 'blur'}
+                ],
+                legalPeople: [
+                    {required: true, message: '请输入公司法定代表人', trigger: 'blur'},
+                ],
+                legalPeopleCardType: [
+                    {required: true, message: '请选择法定代表人证件类型', trigger: 'blur'},
+                ],
+                legalPeopleCardId: [
+                    {required: true, message: '请选择法定代表人证件类型', trigger: 'blur'},
+                ]
+
+            },
+            companytitile:'添加公司',
+
+        },
+
+        methods:{
+            handleSizeChange:function(val) {
+                this.pageSize=val;
+                company_commonQuery(this,this.companyform.companyName,this.currPage,val);
+                //console.log('每页条'+val);
+            },
+            currPageChange:function(val) {
+                this.currPage=val;
+                company_commonQuery(this,this.companyform.companyName,this.currPage,this.pageSize);
+                //console.log('当前页:'+val);
+            },
+            currRowChange:function(val) {
+                this.currentRow = val;
+            },
+            query:function(){
+                this.pagesize=10;
+                this.currPage=1;
+                company_commonQuery(this,this.companyform.companyName,this.currPage,this.pageSize);
+            },
+            addCompany:function () {
+                company_getFillData(this,"-1");
+                this.dialogFormVisible = true;
+                this.companytitile="添加公司"
+            },
+            delCompany:function(companyId){
+                company_deletedata(companyId);
+            },
+            editCompany:function(companyId){
+                company_getFillData(this,companyId);
+                this.dialogFormVisible = true;
+                this.companytitile="修改公司"
+            },
+            resetForm: function (formName) {
+                if (this.$refs[formName] !== undefined) {
+                    this.$refs[formName].resetFields();
+                }
+                this.dialogFormVisible = false;
+            },
+            closeDialog: function (formName) {
+                if (this.$refs[formName] !== undefined) {
+                    this.$refs[formName].resetFields();
+                }
+                this.dialogFormVisible = false;
+            },
+            saveCompany:function (formName) {
+                var _that=this;
+                var vali = false;
+                this.$refs[formName].validate(
+                    function(valid){
+                        if (valid){
+                            vali = true;
+                        }else{
+                            vali=false;
+                        }
+                    });
+                if (vali==true){
+                    company_saveData(_that,_that.companyDiaForm,formName);
+                }
+            },
+            cardTypeform: function (row, column, cellValue) {
+                if (row.legalPeopleCardType == 'idcard') {
+                   return '身份证';
+                } else if (row.legalPeopleCardType == 'military_idcard') {
+                    return '军官证';
+                } else if (row.legalPeopleCardType == 'soldier_idcard') {
+                    return "士兵证";
+                } else if (row.legalPeopleCardType == 'driving_license') {
+                    return "驾驶证";
+                } else if (row.legalPeopleCardType == 'stuempno_idcard') {
+                    return "学工证";
+                } else if (row.legalPeopleCardType == 'taiwan_pass') {
+                    return "台湾同胞来往内地通行证";
+                } else if (row.legalPeopleCardType == 'hk_macau_pass') {
+                    return "港澳居民来往内地通行证";
+                } else if (row.legalPeopleCardType == 'passport') {
+                    return "护照";
+                } else if (row.legalPeopleCardType == 'residence_booklet') {
+                    return "户口本";
+                } else if (row.legalPeopleCardType == 'foreigner_residence_permit') {
+                    return "外国人居留证";
+                } else if (row.legalPeopleCardType == 'unknown_idcard') {
+                    return "其他";
+                } else {
+                    return row.legalPeopleCardType;
+                }
+
+            },
+
+            checkFlagform:function (row, column, cellValue) {
+                if (row.checkFlag == '0'){
+                    return '注册';
+                } else if(row.checkFlag == '1'){
+                    return '修改';
+                } else if (row.checkFlag == '2'){
+                    return '删除';
+                } else {
+                    return row.checkFlag;
+                }
+            }
+
+        },
+        created:function(){
+            var _self=this;
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:encodeURI("[[@{/company/loadCompanyList?companyName=}]]"),
+                success:function(ret){
+                    //console.log(ret);
+                    _self.totSize=ret.PageResult.totalCount;
+                    _self.tableData=ret.PageResult.list;
+                }
+            })
+        }
+    })
+
+    function company_refreshThisTable(){
+        company_commonQuery(company_vue,company_vue.companyform.companyName,company_vue.currPage,company_vue.pageSize);
+    };
+
+    function company_commonQuery(_self,companyName,pageno,pagesize){
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("[[@{/company/loadCompanyList?companyName=}]]" + companyName + "&pageNo=" + pageno + "&pageSize=" + pagesize),
+            success: function (ret) {
+                _self.totSize = ret.PageResult.totalCount;
+                _self.tableData = ret.PageResult.list;
+                if (_self.totSize == 0) {
+                    layer.msg("暂无数据", {icon: 2, time: 1000});
+                }
+            }
+        })
+    }
+
+    function company_deletedata(companyId){
+        layer.confirm('是否删除该公司', {icon: 3, title:'请确认',offset:'30%'},function(index){
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:"[[@{/company/deleteCompany?companyId=}]]"+companyId,
+                success:function(ret){
+                    if(ret.message == undefined){
+                        layer.msg('用户认证已过期，请重新登录', {icon:2,time:1000});
+                        window.location='@{/login}';
+                        return;
+                    }
+                    if (ret.message != "") {
+                        layer.msg(ret.message, {icon: 2, time: 2000});
+                    } else {
+                        layer.msg('删除成功,等待审核!', {icon: 1, time: 2000});
+                        company_refreshThisTable();
+                    }
+                }
+            })
+        })
+    }
+
+
+    function company_getFillData(_self, id) {
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("[[@{/company/loadCompanyForUpdate?companyId=}]]" + id),
+            success: function (ret) {
+                var dictlist = [];
+                var dict = ret.dicts;
+                for (var i = 0; i < dict.length; i++) {
+                    dictlist.push({
+                        value: dict[i]["dictval"],
+                        label: dict[i]["dictcaption"]
+
+                    });
+                }
+                _self.legalPeopleCardTypes = dictlist;
+
+
+                if (ret.company != null) {
+                    _self.companyDiaForm.companyId = ret.company.companyId;
+                    _self.companyDiaForm.companyName = ret.company.companyName;
+                    _self.companyDiaForm.licenseId = ret.company.licenseId;
+                    _self.companyDiaForm.companyAddress = ret.company.companyAddress;
+                    _self.companyDiaForm.legalPeople = ret.company.legalPeople;
+                    _self.companyDiaForm.legalPeopleCardType = ret.company.legalPeopleCardType;
+                    _self.companyDiaForm.legalPeopleCardId = ret.company.legalPeopleCardId;
+                    _self.companyDiaForm.companyPhone = ret.company.companyPhone;
+                    _self.companyDiaForm.remarks = ret.company.remarks;
+
+                }
+
+
+
+            }
+        })
+    }
+
+
+    function company_saveData(_that,formdata,formName){
+        var url = null;
+        if(company_vue.companytitile == "添加公司"){
+            url = encodeURI("[[@{/company/addCompany}]]");
+        }
+        if(company_vue.companytitile == "修改公司"){
+            url = encodeURI("[[@{/company/updateCompany}]]")
+        }
+        var token=$("meta[name='_csrf_token']").attr("value");
+        $.ajax({
+            type: "POST",
+            url: url,
+            dataType: "json",
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            data: JSON.stringify(formdata),
+            success: function (data) {
+                if (data.errStr != "") {
+                    layer.msg(data.errStr, {icon: 2,time:1000});
+                } else {
+                    layer.msg('保存信息成功,等待审核!', {icon: 1,time:1000});
+                    company_refreshThisTable();
+                    _that.$refs[formName].resetFields();
+                    _that.dialogFormVisible = false;
+                }
+            }
+        });
+    }
+
+
+</script>
\ No newline at end of file
diff --git a/src/main/resources/templates/system/companyCheck.html b/src/main/resources/templates/system/companyCheck.html
new file mode 100644
index 0000000..fd37a37
--- /dev/null
+++ b/src/main/resources/templates/system/companyCheck.html
@@ -0,0 +1,431 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">公司审核</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">系统中心</a>
+          <a><cite>公司审核</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div id="companyCheckapp">
+            <el-form :inline="true" ref="companyCheckform" :model="companyCheckform" data-parsley-validate class="form-horizontal form-label-left">
+
+                <div class="col-md-4">
+                    <div class="form-group">
+                        <label class="control-label col-md-4 col-sm-12 col-xs-12" style="font-size: 14px;">公司名称:</span>
+                        </label>
+                        <div class="col-md-8 col-sm-12 col-xs-12">
+                            <el-input v-model="companyCheckform.companyName" ></el-input>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-md-6">
+                    <div class="form-group">
+                        <button type="button" class="btn btn-info" @click="query" id="company_qrybtn">查 询</button>
+                        <button class="btn btn-success" type="button" @click="batchPass">批量通过</button>
+                        <button class="btn btn-danger" type="button" @click="batchFail">批量驳回</button>
+                    </div>
+                </div>
+            </el-form>
+
+            <template>
+                <el-table
+                        ref="singletable"
+                        :data="tableData"
+                        highlight-current-row
+                        @current-change="currRowChange"
+                        stripe
+                        max-height="2000"
+                        border
+                        @selection-change="handleSelect"
+                        style="width: 100%">
+                    <el-table-column
+                            type="selection"
+                            width="55">
+                    </el-table-column>
+                    <el-table-column
+                            sortable
+                            prop="companyId"
+                            label="公司编号"
+                            width="120">
+                    </el-table-column>
+                    <el-table-column
+                            prop="companyName"
+                            label="公司名称"
+                            width="200">
+                    </el-table-column>
+                    <el-table-column
+                            prop="licenseId"
+                            label="营业执照编号"
+                            width="170">
+                    </el-table-column>
+                    <el-table-column
+                            prop="companyAddress"
+                            label="公司地址"
+                            width="220">
+                    </el-table-column>
+                    <el-table-column
+                            prop="legalPeople"
+                            label="法定代表人"
+                            width="120">
+                    </el-table-column>
+                    <el-table-column
+                            prop="legalPeopleCardType"
+                            label="法定代表人证件类型"
+                            width="170"
+                            :formatter="cardTypeform">
+                    </el-table-column>
+                    <el-table-column
+                            prop="legalPeopleCardId"
+                            label="法定代表人证件号码"
+                            width="200">
+                    </el-table-column>
+                    <el-table-column
+                            prop="companyPhone"
+                            label="联系方式"
+                            width="170">
+                    </el-table-column>
+                    <el-table-column
+                            prop="checkFlag"
+                            label="审核标志"
+                            width="100">
+                    </el-table-column>
+
+                    <el-table-column
+                            prop="remarks"
+                            label="备注"
+                            width="180">
+                    </el-table-column>
+                    <el-table-column
+                            label="操作"
+                            width="130">
+                        <template scope="scope">
+                            <button type="button" class="btn btn-success btn-xs" title="审核通过" @click="checkPass(scope.row.companyId)" >审核通过</button>
+                            <button type="button" class="btn btn-danger btn-xs" title="审核驳回" @click="checkFail(scope.row.companyId)" >审核驳回</button>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <div class="clearfix"></div>
+                <el-pagination
+                        @size-change="handleSizeChange"
+                        @current-change="currPageChange"
+                        :current-page="currPage"
+                        :page-sizes="[10, 20, 50, 100]"
+                        :page-size="pageSize"
+                        layout="prev, pager, next,sizes, jumper,total"
+                        :total="totSize">
+                </el-pagination>
+            </template>
+
+            <el-dialog :title="companyChecktitile" :visible.sync="dialogFormVisible"  :modal-append-to-body='false' @close="closeDialog('companyCheckDiaForm')">
+                <el-form ref="companyCheckDiaForm" :model="companyCheckDiaForm" :rules="rules" label-width="13%" >
+
+                    <el-form-item label="审核结果:" prop="checkMessage">
+                        <el-input type="textarea" v-model="companyCheckDiaForm.checkMessage" maxlength="200" style="padding-right: 50px">
+
+                        </el-input>
+                    </el-form-item>
+
+                </el-form>
+                <div slot="footer" class="dialog-footer">
+                    <el-button @click="resetForm('companyCheckDiaForm') ">取 消</el-button>
+                    <el-button type="primary" @click="saveCheckMessage('companyCheckDiaForm')">确 定</el-button>
+                </div>
+            </el-dialog>
+
+        </div>
+    </div>
+</div>
+
+<script>
+    var companyCheck_vue = new Vue({
+        el:'#companyCheckapp',
+        data:{
+            tableData:[],
+            currPage: 1,
+            pageSize:10,
+            totSize:0,
+            currentRow: null,
+            companyCheckform:{
+                companyName:''
+            },
+            selectList:[],
+            dialogFormVisible: false,
+            companyCheckDiaForm:{
+                companyId:'',
+                checkMessage:''
+            },
+            rules:{
+
+            },
+            companyChecktitile:'审核结果',
+
+        },
+
+        methods:{
+            handleSizeChange:function(val) {
+                this.pageSize=val;
+                companyCheck_commonQuery(this,this.companyCheckform.companyName,this.currPage,val);
+                //console.log('每页条'+val);
+            },
+            currPageChange:function(val) {
+                this.currPage=val;
+                companyCheck_commonQuery(this,this.companyCheckform.companyName,this.currPage,this.pageSize);
+                //console.log('当前页:'+val);
+            },
+            currRowChange:function(val) {
+                this.currentRow = val;
+            },
+            query:function(){
+                this.pagesize=10;
+                this.currPage=1;
+                companyCheck_commonQuery(this,this.companyCheckform.companyName,this.currPage,this.pageSize);
+            },
+            checkFail:function (companyId) {
+                companyCheck_getFillData(this,companyId);
+                this.dialogFormVisible = true;
+                this.companyChecktitile="审核结果"
+            },
+
+            checkPass:function(companyId){
+                companyCheck_checkPass(this,companyId);
+            },
+            handleSelect:function(val){
+                this.selectList=val;
+            },
+            batchPass:function(){
+                companyCheck_batchPass();
+            },
+            batchFail:function(){
+                companyCheck_batchFail();
+            },
+            resetForm: function (formName) {
+                if (this.$refs[formName] !== undefined) {
+                    this.$refs[formName].resetFields();
+                }
+                this.dialogFormVisible = false;
+            },
+            closeDialog: function (formName) {
+                if (this.$refs[formName] !== undefined) {
+                    this.$refs[formName].resetFields();
+                }
+                this.dialogFormVisible = false;
+            },
+            saveCheckMessage:function (formName) {
+                var _that=this;
+                var vali = false;
+                this.$refs[formName].validate(
+                    function(valid){
+                        if (valid){
+                            vali = true;
+                        }else{
+                            vali=false;
+                        }
+                    });
+                if (vali==true){
+                    companyCheck_saveCheckMessage(_that,_that.companyCheckDiaForm,formName);
+                }
+            },
+
+            cardTypeform: function (row, column, cellValue) {
+                if (row.legalPeopleCardType == 'idcard') {
+                   return '身份证';
+                } else if (row.legalPeopleCardType == 'military_idcard') {
+                    return '军官证';
+                } else if (row.legalPeopleCardType == 'soldier_idcard') {
+                    return "士兵证";
+                } else if (row.legalPeopleCardType == 'driving_license') {
+                    return "驾驶证";
+                } else if (row.legalPeopleCardType == 'stuempno_idcard') {
+                    return "学工证";
+                } else if (row.legalPeopleCardType == 'taiwan_pass') {
+                    return "台湾同胞来往内地通行证";
+                } else if (row.legalPeopleCardType == 'hk_macau_pass') {
+                    return "港澳居民来往内地通行证";
+                } else if (row.legalPeopleCardType == 'passport') {
+                    return "护照";
+                } else if (row.legalPeopleCardType == 'residence_booklet') {
+                    return "户口本";
+                } else if (row.legalPeopleCardType == 'foreigner_residence_permit') {
+                    return "外国人居留证";
+                } else if (row.legalPeopleCardType == 'unknown_idcard') {
+                    return "其他";
+                } else {
+                    return row.legalPeopleCardType;
+                }
+
+            },
+
+        },
+        created:function(){
+            var _self=this;
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:encodeURI("[[@{/company/loadCompanyCheckList?companyName=}]]"),
+                success:function(ret){
+                    //console.log(ret);
+                    _self.totSize=ret.PageResult.totalCount;
+                    _self.tableData=ret.PageResult.list;
+                }
+            })
+        }
+    })
+
+    function companyCheck_refreshThisTable(){
+        companyCheck_commonQuery(companyCheck_vue,companyCheck_vue.companyCheckform.companyName,companyCheck_vue.currPage,companyCheck_vue.pageSize);
+    };
+
+    function companyCheck_commonQuery(_self,companyName,pageno,pagesize){
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("[[@{/company/loadCompanyCheckList?companyName=}]]" + companyName + "&pageNo=" + pageno + "&pageSize=" + pagesize),
+            success: function (ret) {
+                _self.totSize = ret.PageResult.totalCount;
+                _self.tableData = ret.PageResult.list;
+                if (_self.totSize == 0) {
+                    layer.msg("暂无数据", {icon: 2, time: 1000});
+                }
+            }
+        })
+    }
+
+    function companyCheck_checkPass(_self,companyId) {
+        layer.confirm('是否审核通过该公司', {icon: 3, title:'请确认',offset:'30%'},function(index){
+            $.ajax({
+                type:"get",
+                dataType:"json",
+                url:"[[@{/company/checkPass?companyId=}]]"+companyId,
+                success:function(ret){
+                    if(ret.message == undefined){
+                        layer.msg('用户认证已过期，请重新登录', {icon:2,time:1000});
+                        window.location='@{/login}';
+                        return;
+                    }
+                    if (ret.message != "") {
+                        layer.msg(ret.message, {icon: 2, time: 1000});
+                    } else {
+                        layer.msg('审核成功', {icon: 1, time: 1000});
+                        companyCheck_refreshThisTable();
+                    }
+                }
+            })
+        })
+    }
+
+    function companyCheck_batchPass() {
+        var passList = companyCheck_vue.selectList;
+        if (passList == '') {
+            layer.msg('请选择要审核的公司！', {icon: 2, time: 1000});
+        } else {
+            var url = "[[@{/company/batchCheckPass}]]";
+            var token=$("meta[name='_csrf_token']").attr("value");
+            layer.confirm('确定要审核通过这些公司吗？', {icon: 3, title: '请确认', offset: '30%'}, function (index) {
+                $.ajax({
+                    type: "POST",
+                    url: url,
+                    dataType: "json",
+                    contentType: "application/json",
+                    headers: {
+                        'Accept': 'application/json',
+                        'Content-Type': 'application/json',
+                        'X-CSRF-TOKEN':token,
+                    },
+                    data: JSON.stringify(passList),
+                    success: function (data) {
+                        layer.msg(data.result);
+                        companyCheck_refreshThisTable();
+                    }
+                });
+            })
+        }
+    }
+
+
+
+
+    function companyCheck_saveCheckMessage(_that,formdata,formName){
+        var url = encodeURI("[[@{/company/checkFail}]]");
+        var token=$("meta[name='_csrf_token']").attr("value");
+        $.ajax({
+            type: "POST",
+            url: url,
+            dataType: "json",
+            contentType: "application/json",
+            headers: {
+                'Accept': 'application/json',
+                'Content-Type': 'application/json',
+                'X-CSRF-TOKEN':token,
+            },
+            data: JSON.stringify(formdata),
+            success: function (data) {
+                if (data.errStr != "") {
+                    layer.msg(data.errStr, {icon: 2,time:1000});
+                } else {
+                    layer.msg('审核驳回，保存审核结果成功!', {icon: 1,time:1000});
+                    companyCheck_refreshThisTable();
+                    _that.$refs[formName].resetFields();
+                    _that.dialogFormVisible = false;
+                }
+            }
+        });
+    }
+
+
+    function companyCheck_batchFail() {
+        //代码保存审核结果为---批量审核驳回
+        var passList = companyCheck_vue.selectList;
+        if (passList == '') {
+            layer.msg('请选择要审核的公司！', {icon: 2, time: 1000});
+        } else {
+            var url = "[[@{/company/batchCheckFail}]]";
+            var token=$("meta[name='_csrf_token']").attr("value");
+            layer.confirm('确定要审核驳回这些公司吗？', {icon: 3, title: '请确认', offset: '30%'}, function (index) {
+                $.ajax({
+                    type: "POST",
+                    url: url,
+                    dataType: "json",
+                    contentType: "application/json",
+                    headers: {
+                        'Accept': 'application/json',
+                        'Content-Type': 'application/json',
+                        'X-CSRF-TOKEN':token,
+                    },
+                    data: JSON.stringify(passList),
+                    success: function (data) {
+                        layer.msg(data.result, {icon: 1, time: 1000});
+                        companyCheck_refreshThisTable();
+                    }
+                });
+            })
+        }
+    }
+
+
+    function companyCheck_getFillData(_self, id) {
+        $.ajax({
+            type: "get",
+            dataType: "json",
+            url: encodeURI("[[@{/company/loadCompanyForUpdate?companyId=}]]" + id),
+            success: function (ret) {
+
+
+                if (ret.company != null) {
+                    _self.companyCheckDiaForm.companyId = ret.company.companyId;
+                }
+            }
+        })
+    }
+
+
+</script>
+
+
+<style lang="scss">
+
+    .el-textarea__inner{
+        height: 145px;
+    }
+
+</style>
\ No newline at end of file
