Gogs 5 vuotta sitten
vanhempi
commit
abb6bb186b

+ 97 - 0
src/account/control_bankcard.py

@@ -0,0 +1,97 @@
+#coding=utf-8
+'''
+'''
+import json
+from django.db import transaction
+import common.models as cm
+import common.error_info as ce
+import common.common_functions as ccf
+import common.common_control as ccc
+
+def add_bankcard(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["name","cardno"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    cvals["user_id"] = request.user.id
+    cvals["cid"] = request.user.id
+    cvals["cperson"] = request.user.realname
+    try:
+        obj = cm.BankCard.objects.create(**cvals)
+    except Exception as e:
+        raise ce.TipException(str(e))
+
+
+def update_bankcard(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    id = kwargs.get("id")
+    need_params.extend(["name","cardno"])
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    try:
+        cm.BankCard.objects.filter(id=id).update(**cvals)
+    except Exception as e:
+        raise ce.TipException(str(e))
+
+def delete_bankcard(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    ids = str(kwargs.get("id")).split(",")
+    cm.BankCard.objects.filter(id__in=ids).update(status=0)
+
+
+def get_bankcard_list(request):
+    """
+    """
+    kwargs = request.json
+    eset = cm.BankCard.objects.filter(status=1,user_id=request.user.id)
+    total = eset.count()
+    edata = list(eset.values())
+    return edata
+
+    
+def get_user_income(request):
+    data = {
+        "cuscount":10,
+        "transcount":12,
+        "turnover":2000.00,
+        "income":2000.00
+        }
+    return data
+
+
+def apply_cash(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["bankcard_id","cashtype","cashamount"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    cvals["cid"] = request.user.id
+    cvals["cperson"] = request.user.realname
+    try:
+        obj = cm.CashRecord.objects.create(**cvals)
+    except Exception as e:
+        raise ce.TipException(str(e))
+
+
+
+

+ 81 - 0
src/account/control_department.py

@@ -0,0 +1,81 @@
+#coding=utf-8
+'''
+'''
+import json
+from django.db import transaction
+import common.models as cm
+import common.error_info as ce
+import common.common_functions as ccf
+import common.common_control as ccc
+
+def add_department(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["name","permissions"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    if kwargs.get("pid"):
+        cvals["pid"] = kwargs.get("pid")
+    cvals["cid"] = request.user.id
+    cvals["cperson"] = request.user.realname
+    try:
+        obj = cm.Department.objects.create(**cvals)
+    except Exception as e:
+        raise c.TipException(str(e))
+
+
+def update_department(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    id = kwargs.get("id")
+    need_params.extend(["name","pid","permissions"])
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    if kwargs.get("pid"):
+        cvals["pid"] = kwargs.get("pid")
+    cvals["cid"] = request.user.id
+    cvals["cperson"] = request.user.realname
+    try:
+        cm.Department.objects.filter(id=id).update(**cvals)
+    except Exception as e:
+        raise c.TipException(str(e))
+
+def delete_department(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    ids = str(kwargs.get("id")).split(",")
+    cm.Department.objects.filter(id__in=ids).update(status=0)
+
+
+def get_department_list(request):
+    """
+    """
+    kwargs = request.json
+    eset = cm.Department.objects.filter(status=1)
+    if "name" in kwargs and kwargs.get("name"):
+        eset = eset.filter(name__icontains=kwargs.get("name"))
+    total = eset.count()
+    edata = list(eset.values())
+    page = int(kwargs.get("page",1))
+    page_size = int(kwargs.get("page_size",20))
+    total,data = ccf.get_page_list(edata,page,page_size)
+    return (total,data)
+
+    
+
+
+
+

+ 109 - 133
src/account/control_user.py

@@ -18,156 +18,55 @@ import common.error_info as ce
 import password_handle as ph
 import common.common_functions as ccf
 
-
-def get_user_info(ids,needs=None,relations=None):
-    """
-    needs:表单独字段筛选
-    relations:关联表信息筛选
-    """
-    qset = cm.UserInfo.objects.filter(id__in=ids)
-    if needs:
-        users = qset.values(*needs)
-    else:
-        users = qset.values("id","name","realname","unitname","phone","email",
-                            "platform","parent_id","is_active","organization_id",
-                            "role_id","cperson","remark","ctime","unitname","expiry_date")
-    if relations and "contactsinfo" in relations:
-        for user in users:
-            user.update({"contactsinfo":list(cm.Contacts.objects.filter(user_id=user["id"]).values())})
-    if relations and "authinfo" in relations:
-        for user in users:
-            user.update({"authinfo":list(cm.UserAuthInfo.objects.filter(user_id=user["id"]).values())[0]})
-    if relations and "roleinfo" in relations:
-        for user in users:
-            user.update({"roleinfo":list(cm.Role.objects.filter(id=user["role_id"]).values())[0]})
-
-    for user in users:
-        organization_id = user["organization_id"]
-        if user.get("platform") == "portal":
-            organization_name = cm.Organization.objects.filter(id=organization_id).first().name
-        else:
-            organization_name = user.get("unitname")
-        role = cm.Role.objects.filter(id=user["role_id"]).first()
-        user.update({"role_name":role.name})
-        user.update({"organization_name":organization_name})
-
-    if relations and "pcode" in relations:
-        for user in users:
-            organization_id = user["organization_id"]
-            if user.get("platform") == "portal":
-                organization_name = cm.Organization.objects.filter(id=organization_id).first().name
-            else:
-                organization_name = user.get("unitname")
-            role = cm.Role.objects.filter(id=user["role_id"]).first()
-            pcode = list(role.permission.all().values_list("codename",flat=True))
-            user.update({"pcode":pcode})
-            user.update({"role_name":role.name})
-            user.update({"organization_name":organization_name})
-    return list(users)
-
-def add_user(**kwargs):
+def add_user(request):
     """
     """
-    need_parms = ["name","role_id","expiry_date","authinfo","realname","phone","email"]
-    mse = ccf.check_params(*need_parms,**kwargs)
+    kwargs = request.json
+    need_params = ["realname","phone","department_id","utype","is_active"]
+    mse = ccf.check_params(*need_params,**kwargs)
     if mse:
         raise ce.TipException(mse)
-    if not kwargs.get("organization_id") and not kwargs.get("unitname"):
-        raise ce.TipException(u"组织机构organization_id和unitname必传一个!")
-    if cm.UserInfo.objects.filter(name=kwargs.get("name")).exists():
-        raise ce.TipException(u"用户名重复!")
-    platform = cm.Role.objects.filter(id=kwargs.get("role_id")).first().platform
-    fvals = {
-        "name":kwargs.get("name"),
-        "realname":kwargs.get("realname"),
-        "phone":kwargs.get("phone"),
-        "email":kwargs.get("email"),
-        "organization_id":kwargs.get("organization_id"),
-        "password":kwargs.get("password"),
-        "role_id":kwargs.get("role_id"),
-        "platform":platform,
-        "expiry_date":kwargs.get("expiry_date"),
-        "parent_id":kwargs.get("pid"),
-    }
-    if not fvals.get("password"):
-        #password = "GCD365wsm123!@#"
-        pwd,password = ph.make_default_password(None)
-        fvals.update({"password":password})
-    else:
-        pwd = fvals.get("password")
-        fvals.update({"password":ph.make_password(fvals.get("password"))})
-    with transaction.atomic():
-        uobj = cm.UserInfo.objects.create(**fvals)
-        #保存联系人
-        contactinfo = kwargs.get("contactinfo",[])
-        for ct in contactinfo:
-            ct.update({"user":uobj})
-            cm.Contacts.objects.create(**ct)
-        #保存用户授权信息
-        authinfo = kwargs.get("authinfo")
-        if authinfo:
-            authinfo.update({"user":uobj})
-            cm.UserAuthInfo.objects.create(**authinfo)
-        return {"name":kwargs.get("name"),"password":pwd}
-    return None
-
-def delete_user(**kwargs):
+    if cm.UserInfo.objects.filter(phone=kwargs.get("phone")).exists():
+        raise ce.TipException(u"该用户已存在!")
+    need_params.extend(["email","remark"])
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    cvals.update({"name":cvals.get("phone")})
+    cvals.update({"password":ph.make_password(cvals.get("phone")[-6:],True)})
+    cvals["cid"] = request.user.id
+    cvals["cperson"] = request.user.realname
+    obj = cm.UserInfo.objects.create(**cvals)
+    return obj
+
+
+def delete_user(request):
+    kwargs = request.json
     need_params = ["id"]
     mse = ccf.check_params(*need_params,**kwargs)
     if mse:
         raise ce.TipException(mse)
     ids = str(kwargs.get("id")).split(",")
-    cm.UserInfo.objects.filter(id__in=ids).delete()
+    cm.UserInfo.objects.filter(id__in=ids).update(status=0)
 
 
-def update_user(**kwargs):
+def update_user(request):
     """
     """
+    kwargs = request.json
     need_params = ["id"]
     mse = ccf.check_params(*need_params,**kwargs)
     if mse:
         raise ce.TipException(mse)
-    if not kwargs.get("organization_id") and not kwargs.get("unitname"):
-        raise ce.TipException(u"组织机构organization_id和unitname必传一个!")
-    uvals = {}
-    if "name" in kwargs:
-        if cm.UserInfo.objects.filter(name=kwargs.get("name"))\
-               .exclude(id=kwargs.get("id")).exists():
-            raise ce.TipException(u"用户名重复!")
-        uvals.update({"name":kwargs.get("name")})
     id = kwargs.get("id")
-    if "role_id" in kwargs:
-        uvals.update({"role_id":kwargs.get("role_id")})
-    if "organization_id" in kwargs:
-        uvals.update({"organization_id":kwargs.get("organization_id")})
-    if "unitname" in kwargs:
-        uvals.update({"unitname":kwargs.get("unitname")})
-    if "realname" in kwargs:
-        uvals.update({"realname":kwargs.get("realname")})
-    if "phone" in kwargs:
-        uvals.update({"phone":kwargs.get("phone")})
-    if "email" in kwargs:
-        uvals.update({"email":kwargs.get("email")})
-    if "expiry_date" in kwargs:
-        uvals.update({"expiry_date":kwargs.get("expiry_date")})
-    with transaction.atomic():
-        cm.UserInfo.objects.filter(id=id).update(**uvals)
-        uobj = cm.UserInfo.objects.filter(id=id).first()
-        #保存联系人
-        uobj.contacts.all().delete()
-        contactinfo = kwargs.get("contactinfo",[])
-        for ct in contactinfo:
-            ct.update({"user":uobj})
-            cm.Contacts.objects.create(**ct)
-        #保存用户授权信息
-        uobj.user_auth.delete()
-        authinfo = kwargs.get("authinfo")
-        if authinfo:
-            authinfo.update({"user":uobj})
-            cm.UserAuthInfo.objects.create(**authinfo)
-        return uobj.id
-
-
+    if cm.UserInfo.objects.exclude(id=id).filter(phone=kwargs.get("phone")).exists():
+        raise ce.TipException(u"该用户已存在!")
+    need_params.extend(["realname","phone","department_id","utype","is_active","email","remark"])
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    cvals.update({"name":cvals.get("phone")})
+    cvals.update({"password":ph.make_password(cvals.get("phone")[-6:],True)})
+    cvals["cid"] = request.user.id
+    cvals["cperson"] = request.user.realname
+    obj = cm.UserInfo.objects.filter(id=id).update(**cvals)
+    return obj
 
 def login_user(request):
     """
@@ -223,7 +122,6 @@ def reset_user_password(request):
         raise ce.TipException(mse)
     upk = qdata.get("uid")
     code = qdata.get("code")
-    pkey = get_user_info([upk])[0].get("phone")
     pkey = request.user.phone
     if cache.get(pkey,"") != code:
         raise ce.TipException(u"验证码不正确!")
@@ -255,3 +153,81 @@ def regist_user(request):
         cvals.update({"password":ph.make_password(cvals.get("password"))})
     uobj = cm.UserInfo.objects.create(**cvals)
     return None
+
+
+def format_user(*ids):
+    """
+    """
+    eset = cm.UserInfo.objects.filter(id__in=ids,status=1)
+    if not eset.exists():
+        raise ce.TipException(u"客户不存在!")
+    data = list(eset.values())
+    return data
+
+def get_user_info(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    ids = str(kwargs.get("id")).split(",")
+    info = format_user(*ids)
+    info = info[0] if info else {}
+    return info
+
+def get_user_personal_info(request):
+    """
+    """
+    id = request.user.id
+    info = format_user(*[id])
+    info = info[0] if info else {}
+    return info
+
+def get_account_info(request):
+    """
+    """
+    id = request.user.id
+    info = format_user(*[id])
+    info = info[0] if info else {}
+    info["p"] = ["Product.*.*"]
+    return info
+
+def get_user_list(request):
+    """
+    """
+    kwargs = request.json
+    eset = cm.UserInfo.objects.filter(status=1)
+    if "name" in kwargs and kwargs.get("name"):
+        eset = eset.filter(name__icontains=kwargs.get("name"))
+    if "department_id" in kwargs and kwargs.get("department_id"):
+        eset = eset.filter(department_id=kwargs.get("department_id"))
+    if "utype" in kwargs and kwargs.get("utype"):
+        eset = eset.filter(utype=kwargs.get("utype"))
+    if "is_active" in kwargs and kwargs.get("is_active"):
+        eset = eset.filter(is_active=kwargs.get("is_active"))
+    total = eset.count()
+    edata = list(eset.values())
+    page = int(kwargs.get("page",1))
+    page_size = int(kwargs.get("page_size",20))
+    total,data = ccf.get_page_list(edata,page,page_size)
+    return (total,data)
+
+
+def get_unaudit_user_list(request):
+    """
+    """
+    kwargs = request.json
+    eset = cm.UserInfo.objects.filter(status=1,is_active=0)
+    if "name" in kwargs and kwargs.get("name"):
+        eset = eset.filter(name__icontains=kwargs.get("name"))
+    if "utype" in kwargs and kwargs.get("utype"):
+        eset = eset.filter(utype=kwargs.get("utype"))
+    total = eset.count()
+    edata = list(eset.values())
+    page = int(kwargs.get("page",1))
+    page_size = int(kwargs.get("page_size",20))
+    total,data = ccf.get_page_list(edata,page,page_size)
+    return (total,data)
+

+ 2 - 2
src/account/password_handle.py

@@ -14,11 +14,11 @@ def check_password(new,old):
     np = hashlib.md5(new).hexdigest().upper()
     return np==old
 
-def make_password(pwd):
+def make_password(pwd,isdefault=None):
     """
     @attention: 密码加密
     """
-    if not re.search(r'^.*(?=.{8,15})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[!@#$%^&*?\(\)]).*$',pwd):
+    if not re.search(r'^.*(?=.{8,15})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[!@#$%^&*?\(\)]).*$',pwd) and not isdefault:
         raise ceil.TipException(u"密码不符合符号要求!")
     return hashlib.md5(pwd).hexdigest().upper()
 

+ 9 - 7
src/account/urls_backstage.py

@@ -8,20 +8,22 @@ urlpatterns = [
     # 运营
     url(r'^auth$', views.LoginView.as_view()),
     url(r'^regist$', views.RegistView.as_view()),
-    url(r'^department$', views_backstage.DepartmentView.as_view()),
     url(r'^logout$', views.LogoutView.as_view()),
     url(r'^info$', views_backstage.InfoView.as_view()),
     url(r'^idcode$', views.CaptchaView.as_view()),
     url(r'^phcode$', views.GetPhoneCodeView.as_view()),
     url(r'^user$', views_backstage.UserView.as_view()),
-    url(r'^user/list$', views_backstage.InfoListView.as_view()),
+    url(r'^user/info$', views_backstage.UserInfoView.as_view()),
+    url(r'^user/list$', views_backstage.UserListView.as_view()),
+    url(r'^user/unaudit$', views_backstage.UnauditUserListView.as_view()),
+    url(r'^user/bankcard$', views_backstage.UserBankCardView.as_view()),
+    url(r'^user/bankcard/list$', views_backstage.UserBankCardListView.as_view()),
+    url(r'^user/income$', views_backstage.UserIncomeView.as_view()),
+    url(r'^user/applycash$', views_backstage.UserApplyCashView.as_view()),
     url(r'^pwd/reset$', views_backstage.ResetPwdView.as_view()),
     url(r'^user/pwdreset$', views_backstage.ResetUserPwdView.as_view()),
-    url(r'^role/info', views_backstage.RoleInfoView.as_view()),
-    url(r'^role/list', views_backstage.RoleListView.as_view()),
     url(r'^permission/list', views_backstage.PermissionListView.as_view()),
-    url(r'^ori/tree$', views_backstage.OrganizationTreeView.as_view()),
-    url(r'^ori/search$', views_backstage.OrganizationSearchView.as_view()),
-    url(r'^ori/info$', views_backstage.OrganizationInfoView.as_view()),
+    url(r'^department$', views_backstage.DepartmentView.as_view()),
+    url(r'^department/list$', views_backstage.DepartmentListView.as_view()),
 ]
 

+ 1 - 0
src/account/views.py

@@ -88,6 +88,7 @@ class LogoutView(cv.AuthView):
 class RegistView(cv.BaseView):
     def post(self,request):
         """#用户注册
+        @utype:1/2/3,全职/兼职/企业
         @realname:姓名
         @phone:"15982456282",手机号
         @phcode:"1234",短信验证码

+ 147 - 198
src/account/views_backstage.py

@@ -14,38 +14,44 @@ import control_role as crol
 import control_organization as co
 import common.common_control as ccc
 import control_permission as cp
+import control_department as cd
+import control_bankcard as cb
 
 
 class InfoView(cv.AuthView):
     def get(self, request):
         '''
-        #获取全局账号信息
+        #获取全局账号信息(权限控制)
         '''
-        user = request.user
-        uid = user.id
-        pcode = []
         try:
-            users = cu.get_user_info([uid],None,["pcode"])[0]
+            users = cu.get_account_info(request)
             return cv.to_suc(users)
         except Exception as e:
             return cv.to_fail(e)
 
+class UserInfoView(cv.BaseView):
+    def get(self, request):
+        """
+        #获取用户个人信息
+        @id:1,用户id
+        """
+        try:
+            data = cu.get_user_personal_info(request)
+            return cv.to_suc(data)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc()
+
 class UserView(cv.BaseView):
     def get(self, request):
         """
         #获取用户详情
         @id:1,用户id
         """
-        qdata = request.json
         try:
-            need_params = ["id"]
-            mse = ccf.check_params(*need_params,**qdata)
-            if mse:
-                raise ce.TipException(mse)
-            id = qdata.get("id")
-            res = cu.get_user_info([id],None,relations=["contctsinfo","authinfo","roleinfo"])
-            res = res[0] if res else []
-            return cv.to_suc(res)
+            data = cu.get_user_info(request)
+            return cv.to_suc(data)
         except Exception as e:
             cv.tracefail()
             return cv.to_fail(e)
@@ -53,157 +59,80 @@ class UserView(cv.BaseView):
 
     def post(self, request):
         '''
-        #新增用户
-        @name:"test",用户名
-        @password:"test123456",用户密码
-        @expiry_date:"20191203",过期时间
-        @organization_id:"1",组织机构id角色为门户平台用户传
-        @role_id:7,角色id
-        @unitname:"单位名称",运营中心名称
-        @contactinfo:[{"name":"","email":""}],联系人信息
-        @authinfo":{"max_domain_num":10,"authorized":"available,bug,event","label":"试用"}
-        @realname:"姓名"
+        #新增员工
+        @realname:"肖小肖",员工名称
         @phone:"129823"
         @email:"129823@qq.com"
+        @department_id:1,部门id
+        @utype:1/2/3,员工类型
+        @is_active:1/0,是否启用
+        @remark:"好员工",备注
         '''
         qdata = request.json
         try:
-            qdata["pid"] = request.user.id
-            user = cu.add_user(**qdata)
-            return cv.to_suc(user)
+            rst = cu.add_user(request)
+            return cv.to_suc()
         except Exception as e:
-            import traceback
-            traceback.print_exc()
+            cv.tracefail()
             return cv.to_fail(e)
 
     def put(self, request):
         """
-        #修改用户信息
-        @id:1,用户id其他参数同新增
+        #修改员工
+        @id:1,员工id
+        @realname:"肖小肖",员工名称
+        @phone:"129823"
+        @email:"129823@qq.com"
+        @department_id:1,部门id
+        @utype:1/2/3,员工类型
+        @is_active:1/0,是否启用
+        @remark:"好员工",备注
         """
         qdata = request.json
         try:
-            data = cu.update_user(**qdata)
+            data = cu.update_user(request)
         except Exception as e:
             return cv.to_fail(e)
         return cv.to_suc(data)
 
     def delete(self, request):
         """
-        #删除用户信息
+        #删除员工
         @id:1,多个id用逗号分隔
         """
         qdata = request.json
         try:
-            cu.delete_user(**qdata)
+            cu.delete_user(request)
         except Exception as e:
             return cv.to_fail(e)
         return cv.to_suc()
 
-class InfoListView(cv.AuthView):
+class UserListView(cv.AuthView):
     def get(self, request):
         """
-        #用户列表
+        #员工列表
         @name:"用户名"
-        @page:1
-        @page_size:10
+        @department_id:1
+        @utype:1
+        @is_active:1
         """
-        user = request.user
-        uid = user.id
-        qdata = request.json
-        page = int(qdata.get("page",0))
-        page_size = int(qdata.get("page_size",0))
         try:
-            total,res = ccc.get_sub_users(uid,page,page_size,qdata)
+            total,res = cu.get_user_list(request)
             return cv.to_suc({"total":total,"list":res})
         except Exception as e:
             return cv.to_fail(e)
 
 
-class RoleListView(cv.AuthView):
+class UnauditUserListView(cv.AuthView):
     def get(self, request):
-        """#角色列表
-        @page:1 页面
-        @page_size:10 每页数量,默认10
-        """
-        qdata = request.json
-        print qdata
-        page = qdata.get("page",0)
-        page_size = qdata.get("page_size",10)
-        if page:
-            total,roles = crol.get_role_list(None,page=page,page_size=page_size)
-
-            return cv.to_suc({"total":total,"list":roles})
-        else:
-            roles = crol.get_all_role_list()
-            return cv.to_suc(roles)
-
-
-class RoleInfoView(cv.AuthView):
-    """
-    """
-    def get(self,request):
-        """
-        #角色详情
-        @id:1,角色id
-        """
-        qdata = request.json
-        need_params = ["id"]
-        mse = ccf.check_params(*need_params,**qdata)
-        if mse:
-            raise ce.TipException(mse)
-        id = qdata.get("id")
-        try:
-            role = crol.get_role_info(*[id])
-            role = role[0] if role else {}
-            return cv.to_suc(role)
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-    def post(self,request):
-        """#角色添加
-        @name:"test" 角色名称
-        @desc:"test" 角色描述
-        @permission_addroles:[1,2,3] 可以添加的用户角色
-        @permssions:[1,2,3] 权限ID
-        @platform:"operation" 角色归属
-        """
-        qdata = request.json
-        uname = request.user.name
-        qdata.update({"cperson":uname})
-        try:
-            crol.add_role(**qdata)
-            return cv.to_suc()
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-    def put(self,request):
-        """#角色修改
-        @id:3 角色id
-        @name:"test" 角色名称
-        @desc:"test" 角色描述
-        @permission_addroles:[1,2,3] 可以添加的用户角色
-        @permssions:[1,2,3] 权限ID
-        @platform:"operation" 角色归属
         """
-        qdata = request.json
-        try:
-            crol.update_role(**qdata)
-            return cv.to_suc()
-        except Exception as e:
-            return cv.to_fail(e)
-
-    def delete(self,request):
-        """
-        #角色删除
-        @id:1,2 角色id批量删除多个id用逗号分隔
+        #待审核员工列表
+        @name:"用户名"
+        @utype:1
         """
-        qdata = request.json
         try:
-            crol.delete_role(**qdata)
-            return cv.to_suc()
+            total,res = cu.get_unaudit_user_list(request)
+            return cv.to_suc({"total":total,"list":res})
         except Exception as e:
             return cv.to_fail(e)
 
@@ -222,129 +151,149 @@ class PermissionListView(cv.AuthView):
         return cv.to_suc(roles)
 
 
-class OrganizationTreeView(cv.AuthView):
-    def get(self, request):
-        """#获取组织机构树
+class ResetPwdView(cv.BaseView):
+    def put(self, request):
+        """
+        #重置密码(忘记密码)
+        @phone:"15982456282",手机号
+        @password:"",新密码
+        @repassword:"",确认密码
+        @phcode:"123",验证码
         """
         try:
-            uid = request.user.id
-            otree = co.get_organization_tree(uid)
-            return cv.to_suc(otree)
+            cu.reset_password(request)
+            return cv.to_suc()
         except Exception as e:
-            cv.tracefail()
             return cv.to_fail(e)
 
 
-class OrganizationSearchView(cv.AuthView):
-    def get(self, request):
-        """#搜索组织机构
-        @name:u"测试单位1"
+class ResetUserPwdView(cv.AuthView):
+    def put(self, request):
+        """
+        #修改用户密码
+        @uid:10,用户id不传则默认当前用户
+        @code:"",验证码
+        @password:"",新密码
         """
         try:
-            uid = request.user.id
-            print request.json
-            name = request.json.get("name","")
-            otree = co.search_organization(name)
-            return cv.to_suc(otree)
+            cu.reset_user_password(request)
+            return cv.to_suc()
         except Exception as e:
             return cv.to_fail(e)
 
 
-class OrganizationInfoView(cv.AuthView):
-    def get(self, request):
-        """#获取组织机详情
-        @id:1,组织机构id
+class DepartmentView(cv.AuthView):
+    def post(self,request):
+        """
+        #新增部门
+        @name:"综管部",部门名称
+        @pid:1,上级部门
+        @permissions:["CusManage.*.*","CusManage.MyCus.*"]
         """
-        qdata = request.json
-        need_params = ["id"]
-        mse = ccf.check_params(*need_params,**qdata)
-        if mse:
-            raise ce.TipException(mse)
-        id = qdata.get("id")
         try:
-            oinfo = co.get_organization_info(*[id])[0]
-            return cv.to_suc(oinfo)
+            cd.add_department(request)
+            return cv.to_suc()
         except Exception as e:
             return cv.to_fail(e)
 
-
-    def post(self, request):
-        """#添加组织机构
-        @name:"",组织机构名称
-        @sname:"",组织机构简称
-        @desc:"",简介 非必传
-        @pid:"",上级组织机构id 非必传
+    def put(self,request):
+        """
+        #修改部门
+        @id:1,部门id
+        @name:"综管部",部门名
+        @pid:1,上级部门
+        @permissions:["CusManage.*.*","CusManage.MyCus.*"]
         """
-        qdata = request.json
-        user = request.user
-        qdata.update({"cperson":user.name,"cid":user.id})
         try:
-            co.add_organization(**qdata)
+            cd.update_department(request)
             return cv.to_suc()
         except Exception as e:
             return cv.to_fail(e)
 
-
-    def put(self, request):
-        """#修改组织机构
-        @id:"",组织机构id
+    def delete(self,request):
+        """
+        #删除部门
+        @id:1,部门id
         """
-        qdata = request.json
         try:
-            co.update_organization(**qdata)
+            cd.delete_department(request)
             return cv.to_suc()
         except Exception as e:
             return cv.to_fail(e)
 
 
-    def delete(self, request):
-        """#删除组织机构
-        @id:1,2 组织机构id批量删除多个id用逗号分隔
+class DepartmentListView(cv.AuthView):
+    def get(self,request):
+        """#部门列表
+        @name:"研发",部门名称
         """
-        qdata = request.json
         try:
-            co.delete_organization(**qdata)
-            return cv.to_suc()
+            total,rst = cd.get_department_list(request)
         except Exception as e:
+            cv.tracefail()
             return cv.to_fail(e)
+        return cv.to_suc({"total":total,"list":rst})
 
 
-class ResetPwdView(cv.BaseView):
-    def put(self, request):
+class UserBankCardView(cv.AuthView):
+    def post(self,request):
+        """#新增银行卡
+        @name:"建设银行",银行名称
+        @cardno:"6229000",银行卡卡号
         """
-        #重置密码(忘记密码)
-        @phone:"15982456282",手机号
-        @password:"",新密码
-        @repassword:"",确认密码
-        @phcode:"123",验证码
+        try:
+            rst = cb.add_bankcard(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc()
+
+    def delete(self,request):
+        """#删除银行卡
+        @id:1,银行卡id
         """
         try:
-            cu.reset_password(request)
-            return cv.to_suc()
+            rst = cb.delete_bankcard(request)
         except Exception as e:
+            cv.tracefail()
             return cv.to_fail(e)
+        return cv.to_suc()
 
 
-class ResetUserPwdView(cv.AuthView):
-    def put(self, request):
+class UserBankCardListView(cv.AuthView):
+    def get(self,request):
+        """#银行卡列表
         """
-        #修改用户密码
-        @uid:10,用户id不传则默认当前用户
-        @code:"",验证码
-        @password:"",新密码
+        try:
+            rst = cb.get_bankcard_list(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc(rst)
+
+
+class UserIncomeView(cv.AuthView):
+    def get(self,request):
+        """#我的收益
         """
         try:
-            cu.reset_user_password(request)
-            return cv.to_suc()
+            rst = cb.get_user_income(request)
         except Exception as e:
+            cv.tracefail()
             return cv.to_fail(e)
+        return cv.to_suc(rst)
 
 
-class DepartmentView(cv.AuthView):
+class UserApplyCashView(cv.AuthView):
     def post(self,request):
+        """#申请提现
+        @bankcard_id:1,银行卡id
+        @cashtype:"bank/alipay",提现方式
+        @cashamount:1000,提现金额
         """
-        #新增部门
-        @name:"综管部",部门名称
-        @pid:1,上级部门
-        @permissions:["CusManage.*.*","CusManage.MyCus.*"]
-        """
+        try:
+            rst = cb.apply_cash(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc(rst)

+ 45 - 2
src/common/models.py

@@ -10,6 +10,7 @@ class Department(models.Model):
     name = models.CharField(u"组织名称",max_length=256,blank=True)
     pid = models.CharField(u"父节点ID",max_length=16,blank=True)
     permissions = models.TextField(u"权限",blank=True,null=True)
+    status = models.SmallIntegerField(u"状态(0删除)",default=1)
 
     cid = models.IntegerField(u"创建人ID",blank=True)
     cperson = models.CharField(u"创建人",max_length=255,blank=True)
@@ -31,6 +32,8 @@ class UserInfo(models.Model):
     remark = models.TextField(u"备注", blank=True,null=True)
     avatar = models.CharField(u"手机号", max_length=64, blank=True,null=True)
     vcard = models.TextField(u"电子名片", blank=True,null=True)
+    utype = models.SmallIntegerField(u"用户类型", blank=True,null=True,default=1)
+    status = models.SmallIntegerField(u"状态(0删除)",default=1)
 
     last_login = models.CharField(u"上次登录时间", max_length=128, blank=True,null=True,db_column='last_login_time')
     last_login_ip = models.CharField(u"上次登录IP", max_length=128, blank=True,null=True)
@@ -188,6 +191,7 @@ class EnterPrise(models.Model):
     funding = models.CharField(u"融资情况",max_length=50,blank=True,null=True)
     legalstate = models.CharField(u"法务情况",max_length=50,blank=True,null=True)
     remark = models.TextField(u"备注",blank=True,null=True)
+    status = models.SmallIntegerField(u"状态(0删除)",default=1)
 
     cid = models.IntegerField(u"创建人ID",blank=True,null=True)
     cperson = models.CharField(u'邮件主题', blank=True, max_length=128,null=True)
@@ -205,6 +209,7 @@ class Product(models.Model):
     ptype = models.CharField(u'产品类型',max_length=128)
     intro = models.TextField(u'产品简介',max_length=128)
     content = models.TextField(u'产品详情')
+    status = models.SmallIntegerField(u"状态(0删除)",default=1)
 
     cid = models.IntegerField(u"创建人ID",blank=True,null=True)
     cperson = models.CharField(u'邮件主题', blank=True, max_length=128,null=True)
@@ -218,10 +223,12 @@ class Product(models.Model):
 class Transaction(models.Model):
     """交易
     """
-    enterprise = models.ForeignKey("EnterPrise",verbose_name="企业")
-    product = models.ForeignKey("Product",verbose_name="成交产品")
+    enterprise = models.ForeignKey("EnterPrise",verbose_name="企业",related_name="enttrans")
+    product = models.ForeignKey("Product",verbose_name="成交产品",related_name="enttrans_pro")
+    price = models.FloatField(u"价格")
     service_period = models.CharField(u"服务周期",max_length=100)
     remark = models.TextField(u"备注",blank=True,null=True)
+    status = models.SmallIntegerField(u"状态(0删除)",default=1)
 
     cid = models.IntegerField(u"创建人ID",blank=True,null=True)
     cperson = models.CharField(u'邮件主题', blank=True, max_length=128,null=True)
@@ -230,3 +237,39 @@ class Transaction(models.Model):
     class Meta:
         db_table = "transaction"
         verbose_name = u"企业交易"
+
+
+class BankCard(models.Model):
+    """
+    """
+    user_id = models.IntegerField(u"用户id")
+    name = models.CharField(u'名称',max_length=128)
+    cardno = models.CharField(u'银行账户',max_length=128)
+    status = models.SmallIntegerField(u"状态(0删除)",default=1)
+
+    cid = models.IntegerField(u"创建人ID",blank=True,null=True)
+    cperson = models.CharField(u'邮件主题', blank=True, max_length=128,null=True)
+    ctime = models.DateTimeField(u"创建时间(发送时间)", auto_now_add=True)
+
+    class Meta:
+        db_table = "bankcard"
+        verbose_name = u"银行卡"
+
+
+class CashRecord(models.Model):
+    """
+    """
+    bankcard_id = models.IntegerField(u'银行卡')
+    cardname = models.CharField(u'名称',max_length=128,blank=True,null=True)
+    cardno = models.CharField(u'银行账户',max_length=128,blank=True,null=True)
+    cashtype = models.CharField(u'提现方式',max_length=128)
+    cashamount = models.FloatField(u'提现金额')
+    cash_status = models.SmallIntegerField(u"提现状态(0待处理)",default=0)
+
+    cid = models.IntegerField(u"创建人ID",blank=True,null=True)
+    cperson = models.CharField(u'邮件主题', blank=True, max_length=128,null=True)
+    ctime = models.DateTimeField(u"创建时间(发送时间)", auto_now_add=True)
+
+    class Meta:
+        db_table = "cashrecord"
+        verbose_name = u"提现记录"

+ 0 - 0
src/enterprise/__init__.py


+ 131 - 0
src/enterprise/control_enterprise.py

@@ -0,0 +1,131 @@
+#coding=utf-8
+'''
+'''
+import json
+from django.db import transaction
+import common.models as cm
+import common.error_info as ce
+import common.common_functions as ccf
+import common.common_control as ccc
+
+def add_enterprise(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["name","regno","licenceorg","enttype","address","legalperson",
+        "entcontact","industry","taxtype"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    need_params.extend(["subindustry","profit","turnover","entscale","regdate",
+        "busscope","principals","finacial","funding","legalstate","remark"])
+
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    cvals["cid"] = request.user.id
+    cvals["cperson"] = request.user.realname
+    #生成评分和客户编号待完善
+    if cm.EnterPrise.objects.filter(name=cvals.get("name")).exists():
+        raise ce.TipException(u"该客户已录入!")
+    try:
+        entobj = cm.EnterPrise.objects.create(**cvals)
+    except Exception as e:
+        raise c.TipException(str(e))
+
+
+def update_enterprise(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["id","name","regno","licenceorg","enttype","address","legalperson",
+        "entcontact","industry","taxtype"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    need_params.extend(["subindustry","profit","turnover","entscale","regdate",
+        "busscope","principals","finacial","funding","legalstate","remark"])
+
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    cvals["principals"] = json.dumps(cvals["principals"]) 
+    cvals["cid"] = request.user.id
+    cvals["cperson"] = request.user.realname
+    #生成评分和客户编号待完善
+    if cm.EnterPrise.objects.exclude(id=cvals.get("id")).filter(name=cvals.get("name")).exists():
+        raise ce.TipException(u"该客户已录入!")
+    try:
+        cm.EnterPrise.objects.filter(id=cvals.get("id")).update(**cvals)
+    except Exception as e:
+        raise c.TipException(str(e))
+
+
+def delete_enterprise(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    ids = str(kwargs.get("id")).split(",")
+    cm.EnterPrise.objects.filter(id__in=ids).update(status=0)
+
+
+def format_enterprise(*ids):
+    """
+    """
+    eset = cm.EnterPrise.objects.filter(id__in=ids,status=1)
+    if not eset.exists():
+        raise ce.TipException(u"客户不存在!")
+    data = list(eset.values())
+    for item in data:
+        item["principals"] = json.loads(item["principals"])
+    return data
+
+def get_enterprise_info(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    ids = str(kwargs.get("id")).split(",")
+    entinfo = format_enterprise(*ids)
+    entinfo = entinfo[0] if entinfo else {}
+
+    return entinfo
+
+
+def get_enterprise_list(request):
+    """
+    """
+    kwargs = request.json
+    eset = cm.EnterPrise.objects.filter(status=1)
+    if "name" in kwargs and kwargs.get("name"):
+        eset = eset.filter(name__icontains=kwargs.get("name"))
+    if "industry" in kwargs and kwargs.get("industry"):
+        eset = eset.filter(industry__icontains=kwargs.get("industry"))
+    if "istrans" in kwargs and kwargs.get("istrans"):
+        if kwargs.get("istrans") == 0:
+            eset = eset.filter(enttrans__set__isnull=True)
+        else:
+            eset = eset.filter(enttrans__set__isnull=False)
+    if "transpro" in kwargs and kwargs.get("transpro"):
+        pass
+    if "licenceorg" in kwargs and kwargs.get("licenceorg"):
+        eset = eset.filter(licenceorg=kwargs.get("licenceorg"))
+    if "enttype" in kwargs and kwargs.get("enttype"):
+        eset = eset.filter(enttype=kwargs.get("enttype"))
+    if "turnover" in kwargs and kwargs.get("turnover"):
+        pass
+    total = eset.count()
+    edata = list(eset.values())
+    page = int(kwargs.get("page",1))
+    page_size = int(kwargs.get("page_size",20))
+    total,data = ccf.get_page_list(edata,page,page_size)
+    return (total,data)
+
+    
+
+
+
+

+ 129 - 0
src/enterprise/control_organization.py

@@ -0,0 +1,129 @@
+#coding=utf-8
+'''
+'''
+import json
+from django.db.models import Q
+from django.db import transaction
+import common.models as cm
+import common.common_functions as ccf
+import common.common_control as ccc
+import common.error_info as ce
+
+
+def search_organization(name):
+    """
+    """
+    qset = cm.Organization.objects.filter(name__icontains=name)
+    qdata = list(qset.values_list("name",flat=True))
+    return qdata
+
+def get_organization_tree(uid):
+    """
+    """
+    user = cm.UserInfo.objects.filter(pk=uid).first()
+    if not user:
+        raise ce.TipException(u"用户不存在")
+    uid = user.pk
+
+    total,users_info = ccc.get_sub_users(uid)
+    print users_info
+    user_ids = [x["id"] for x in users_info]
+    permissions = list(user.role.permission.all().values_list("codename",flat=True))
+
+    if user.role.platform == "portal":
+        #数据权限下用户所在的企业
+        org_ids = list(cm.UserInfo.objects.filter(id__in=user_ids).values_list("organization_id",flat=True))
+        #数据权限下的用户创建的企业
+        for uid in user_ids:
+            _user = cm.UserInfo.objects.filter(id=uid).first()
+            if "SystemManagement.Organization.Check" in permissions:
+                org_ids_created = list(cm.Organization.objects.filter(cid__in=[uid]).values_list("id",flat=True))
+                org_ids.extend(org_ids_created)
+        #orgs = cm.Organization.objects.filter(id__in=org_ids)
+        orgs = cm.Organization.objects.filter(id__in=org_ids,cid=uid).exclude(pid__in=org_ids)
+    else:
+        print 6666666666666666
+        orgs = cm.Organization.objects.filter(cid__in=user_ids)
+
+    org_ids = list(orgs.values_list("id",flat=True))
+    print org_ids,9999
+    #组装树结构
+    trees = []
+    for org in orgs:
+        if user.role.platform == "portal":
+            trees.append(ccc.get_sub_organization_tree(org.id))
+        else:
+            if not org.pid:
+                trees.append(ccc.get_sub_organization_tree(org.id))
+
+    otree = [
+        {
+            "id":1,
+            "nodes":[
+                {
+                    "id":2,
+                    "nodes":[
+                    
+                    ],
+                    "tree_label":u"成都代理运营中心"
+                } 
+            ],
+            "tree_label":u"成都运营中心"
+        } 
+    ]
+    return trees
+
+
+def add_organization(**kwargs):
+    """
+    """
+    need_params = ["name","sname"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    need_params.extend(["pid","cid","cperson","desc"])
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    with transaction.atomic():
+        oobj = cm.Organization.objects.create(**cvals)
+
+
+def update_organization(**kwargs):
+    """
+    """
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    id = kwargs.get("id")
+    uvals = {}
+    if "name" in kwargs:
+        uvals["name"] = kwargs.get("name")
+    if "sname" in kwargs:
+        uvals["sname"] = kwargs.get("sname")
+    if "desc" in kwargs:
+        uvals["desc"] = kwargs.get("desc")
+
+    with transaction.atomic():
+        oobj = cm.Organization.objects.filter(id=id).update(**uvals)
+
+
+def delete_organization(**kwargs):
+    """
+    """
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    ids = str(kwargs.get("id")).split(",")
+    cm.Organization.objects.filter(id__in=ids).delete()
+    
+    #级联删除相关联数据待完善...
+
+
+def get_organization_info(*ids):
+    """
+    """
+    qset = cm.Organization.objects.filter(id__in=ids)
+    oinfo = list(qset.values("id","name","sname","desc","pid"))
+    return oinfo
+

+ 36 - 0
src/enterprise/control_permission.py

@@ -0,0 +1,36 @@
+#-*-coding:utf-8 -*-
+import re
+import collections
+import common.models as cm
+
+def get_permission_list(role_id=None,platform=None):
+    """
+    """
+    if role_id:
+        qset = cm.Role.objects.filter(id=role_id).first().permission.all()
+    else:
+        qset = cm.Permission.objects.all()
+    if platform:
+        qset = qset.filter(platform__icontains=platform)
+    permissions = format_permission_tree(qset)
+    return permissions
+
+def get_permission_tree(pobj,data=None):
+    data = data if data else []
+    childrenset = cm.Permission.objects.filter(pid=pobj.id)
+    for cdobj in childrenset:
+        data.append({"id":cdobj.id,"name":cdobj.name,"codename":cdobj.codename,"children":get_permission_tree(cdobj)})
+    return data
+
+
+def format_permission_tree(qset):
+    """暂时写死待完善....
+    """
+    ptrees = []
+    toppers = qset.filter(pid__isnull=True)
+    for topobj in toppers:
+        ptree = {"id":topobj.id,"name":topobj.name,"codename":topobj.codename}
+        ptree["children"] = get_permission_tree(topobj)
+        ptrees.append(ptree)
+    return ptrees
+

+ 106 - 0
src/enterprise/control_role.py

@@ -0,0 +1,106 @@
+#coding=utf-8
+'''
+'''
+import json
+from django.db import transaction
+import common.models as cm
+import common.error_info as ce
+import common.common_functions as ccf
+import common.common_control as ccc
+
+def get_role_list(query=None,relations=None,page=None,page_size=None):
+    """
+    """
+    qset = cm.Role.objects.all()
+    if query and query.get("platform"):
+        qset = qset.filter(platform=query.get("platform"))
+    total,qset = ccc.get_page_qset(qset,page,page_size)
+    roles = qset.values("id","name","desc","ctime","platform")
+    if relations:
+        for i,role in enumerate(roles):
+            permissions = list(qset[i].permission.all().values_list("name",flat=True))
+            role.update({"permissions":",".join(permissions)})
+    return total,list(roles)
+
+
+def get_role_info(*ids):
+    """
+    """
+    qset = cm.Role.objects.filter(id__in=ids)
+    roles = list(qset.values())
+    for i,role in enumerate(roles):
+        role["permission_addroles"] = json.loads(role["permission_addroles"])
+        permissions = list(qset[i].permission.all().values("name","id"))
+        role.update({"permissions":permissions})
+    return roles
+
+
+def get_all_role_list():
+    qset = cm.Role.objects.all()
+    roles = qset.values("id","name","desc","ctime","platform")
+    return list(roles)
+
+
+def add_role(**kwargs):
+    """
+    """
+    need_params = ["name","platform","permissions"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    need_params.extend(["cperson","desc"])
+    try:
+        permission_addroles = kwargs.pop("permission_addroles")
+        permissions = kwargs.pop("permissions")
+    except KeyError:
+        permission_addroles = None
+        permissions = None
+
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    with transaction.atomic():
+        robj = cm.Role.objects.create(**cvals)
+        #添加permission
+        robj.permission_addroles = json.dumps(permission_addroles)
+        robj.permission.add(*permissions)
+        robj.save()
+
+
+def update_role(**kwargs):
+    """
+    """
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    id = kwargs.get("id")
+    uvals = {}
+    if "name" in kwargs:
+        uvals["name"] = kwargs.get("name")
+    if "desc" in kwargs:
+        uvals["desc"] = kwargs.get("desc")
+    if "permission_addroles" in kwargs:
+        uvals["permission_addroles"] = json.dumps(kwargs.get("permission_addroles"))
+    with transaction.atomic():
+        robj = cm.Role.objects.filter(id=id).first()
+        cm.Role.objects.filter(id=id).update(**uvals)
+        if robj:
+            robj.permission.remove()
+            robj.permission.add(*kwargs.get("permissions"))
+
+
+def delete_role(**kwargs):
+    """
+    """
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    ids = str(kwargs.get("id")).split(",")
+    cm.Role.objects.filter(id__in=ids).delete()
+
+
+
+
+
+
+

+ 104 - 0
src/enterprise/control_transaction.py

@@ -0,0 +1,104 @@
+#coding=utf-8
+'''
+'''
+import json
+from django.db import transaction
+import common.models as cm
+import common.error_info as ce
+import common.common_functions as ccf
+import common.common_control as ccc
+
+def add_transaction(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["enterprise_id","product_id","price","service_period"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    cvals["cid"] = request.user.id
+    cvals["cperson"] = request.user.realname
+    try:
+        tansobj = cm.Transaction.objects.create(**cvals)
+    except Exception as e:
+        raise c.TipException(str(e))
+
+
+def update_transaction(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["id","enterprise_id","product_id","price","service_period"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+
+    cvals = ccf.get_need_params(*need_params,**kwargs)
+    try:
+        cm.Transaction.objects.filter(id=cvals.get("id")).update(**cvals)
+    except Exception as e:
+        raise c.TipException(str(e))
+
+
+def delete_transaction(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    ids = str(kwargs.get("id")).split(",")
+    cm.Transaction.objects.filter(id__in=ids).update(status=0)
+
+
+def format_transaction(*ids):
+    """
+    """
+    eset = cm.Transaction.objects.filter(id__in=ids,status=1)
+    if not eset.exists():
+        raise ce.TipException(u"客户不存在!")
+    data = list(eset.values())
+    return data
+
+def get_transaction_info(request):
+    """
+    """
+    kwargs = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    ids = str(kwargs.get("id")).split(",")
+    entinfo = format_transaction(*ids)
+    entinfo = entinfo[0] if entinfo else {}
+
+    return entinfo
+
+
+def get_transaction_list(request):
+    """
+    """
+    kwargs = request.json
+    eset = cm.Transaction.objects.filter(status=1)
+    if "enterprise_name" in kwargs and kwargs.get("enterprise_name"):
+        #eset = eset.filter(name__icontains=kwargs.get("name"))
+        pass
+    if "product_id" in kwargs and kwargs.get("product_id"):
+        eset = eset.filter(product_id=kwargs.get("product_id"))
+    if "enterprise_id" in kwargs and kwargs.get("enterprise_id"):
+        eset = eset.filter(product_id=kwargs.get("enterprise_id"))
+    total = eset.count()
+    edata = list(eset.values())
+    page = int(kwargs.get("page",1))
+    page_size = int(kwargs.get("page_size",20))
+    total,data = ccf.get_page_list(edata,page,page_size)
+    return (total,data)
+
+    
+
+
+
+

+ 257 - 0
src/enterprise/control_user.py

@@ -0,0 +1,257 @@
+#coding=utf-8
+'''
+'''
+import json
+import datetime
+import logging
+import re
+
+import hashlib
+import xlrd
+from django.core.cache import cache
+from django.db.models import Q
+from django.db.models import Sum
+from django.db import transaction
+from django.contrib import auth
+import common.models as cm
+import common.error_info as ce
+import password_handle as ph
+import common.common_functions as ccf
+
+
+def get_user_info(ids,needs=None,relations=None):
+    """
+    needs:表单独字段筛选
+    relations:关联表信息筛选
+    """
+    qset = cm.UserInfo.objects.filter(id__in=ids)
+    if needs:
+        users = qset.values(*needs)
+    else:
+        users = qset.values("id","name","realname","unitname","phone","email",
+                            "platform","parent_id","is_active","organization_id",
+                            "role_id","cperson","remark","ctime","unitname","expiry_date")
+    if relations and "contactsinfo" in relations:
+        for user in users:
+            user.update({"contactsinfo":list(cm.Contacts.objects.filter(user_id=user["id"]).values())})
+    if relations and "authinfo" in relations:
+        for user in users:
+            user.update({"authinfo":list(cm.UserAuthInfo.objects.filter(user_id=user["id"]).values())[0]})
+    if relations and "roleinfo" in relations:
+        for user in users:
+            user.update({"roleinfo":list(cm.Role.objects.filter(id=user["role_id"]).values())[0]})
+
+    for user in users:
+        organization_id = user["organization_id"]
+        if user.get("platform") == "portal":
+            organization_name = cm.Organization.objects.filter(id=organization_id).first().name
+        else:
+            organization_name = user.get("unitname")
+        role = cm.Role.objects.filter(id=user["role_id"]).first()
+        user.update({"role_name":role.name})
+        user.update({"organization_name":organization_name})
+
+    if relations and "pcode" in relations:
+        for user in users:
+            organization_id = user["organization_id"]
+            if user.get("platform") == "portal":
+                organization_name = cm.Organization.objects.filter(id=organization_id).first().name
+            else:
+                organization_name = user.get("unitname")
+            role = cm.Role.objects.filter(id=user["role_id"]).first()
+            pcode = list(role.permission.all().values_list("codename",flat=True))
+            user.update({"pcode":pcode})
+            user.update({"role_name":role.name})
+            user.update({"organization_name":organization_name})
+    return list(users)
+
+def add_user(**kwargs):
+    """
+    """
+    need_parms = ["name","role_id","expiry_date","authinfo","realname","phone","email"]
+    mse = ccf.check_params(*need_parms,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    if not kwargs.get("organization_id") and not kwargs.get("unitname"):
+        raise ce.TipException(u"组织机构organization_id和unitname必传一个!")
+    if cm.UserInfo.objects.filter(name=kwargs.get("name")).exists():
+        raise ce.TipException(u"用户名重复!")
+    platform = cm.Role.objects.filter(id=kwargs.get("role_id")).first().platform
+    fvals = {
+        "name":kwargs.get("name"),
+        "realname":kwargs.get("realname"),
+        "phone":kwargs.get("phone"),
+        "email":kwargs.get("email"),
+        "organization_id":kwargs.get("organization_id"),
+        "password":kwargs.get("password"),
+        "role_id":kwargs.get("role_id"),
+        "platform":platform,
+        "expiry_date":kwargs.get("expiry_date"),
+        "parent_id":kwargs.get("pid"),
+    }
+    if not fvals.get("password"):
+        #password = "GCD365wsm123!@#"
+        pwd,password = ph.make_default_password(None)
+        fvals.update({"password":password})
+    else:
+        pwd = fvals.get("password")
+        fvals.update({"password":ph.make_password(fvals.get("password"))})
+    with transaction.atomic():
+        uobj = cm.UserInfo.objects.create(**fvals)
+        #保存联系人
+        contactinfo = kwargs.get("contactinfo",[])
+        for ct in contactinfo:
+            ct.update({"user":uobj})
+            cm.Contacts.objects.create(**ct)
+        #保存用户授权信息
+        authinfo = kwargs.get("authinfo")
+        if authinfo:
+            authinfo.update({"user":uobj})
+            cm.UserAuthInfo.objects.create(**authinfo)
+        return {"name":kwargs.get("name"),"password":pwd}
+    return None
+
+def delete_user(**kwargs):
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    ids = str(kwargs.get("id")).split(",")
+    cm.UserInfo.objects.filter(id__in=ids).delete()
+
+
+def update_user(**kwargs):
+    """
+    """
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    if not kwargs.get("organization_id") and not kwargs.get("unitname"):
+        raise ce.TipException(u"组织机构organization_id和unitname必传一个!")
+    uvals = {}
+    if "name" in kwargs:
+        if cm.UserInfo.objects.filter(name=kwargs.get("name"))\
+               .exclude(id=kwargs.get("id")).exists():
+            raise ce.TipException(u"用户名重复!")
+        uvals.update({"name":kwargs.get("name")})
+    id = kwargs.get("id")
+    if "role_id" in kwargs:
+        uvals.update({"role_id":kwargs.get("role_id")})
+    if "organization_id" in kwargs:
+        uvals.update({"organization_id":kwargs.get("organization_id")})
+    if "unitname" in kwargs:
+        uvals.update({"unitname":kwargs.get("unitname")})
+    if "realname" in kwargs:
+        uvals.update({"realname":kwargs.get("realname")})
+    if "phone" in kwargs:
+        uvals.update({"phone":kwargs.get("phone")})
+    if "email" in kwargs:
+        uvals.update({"email":kwargs.get("email")})
+    if "expiry_date" in kwargs:
+        uvals.update({"expiry_date":kwargs.get("expiry_date")})
+    with transaction.atomic():
+        cm.UserInfo.objects.filter(id=id).update(**uvals)
+        uobj = cm.UserInfo.objects.filter(id=id).first()
+        #保存联系人
+        uobj.contacts.all().delete()
+        contactinfo = kwargs.get("contactinfo",[])
+        for ct in contactinfo:
+            ct.update({"user":uobj})
+            cm.Contacts.objects.create(**ct)
+        #保存用户授权信息
+        uobj.user_auth.delete()
+        authinfo = kwargs.get("authinfo")
+        if authinfo:
+            authinfo.update({"user":uobj})
+            cm.UserAuthInfo.objects.create(**authinfo)
+        return uobj.id
+
+
+
+def login_user(request):
+    """
+    """
+    info = request.json
+    login_info = info.get('username')
+    password = info.get('password')
+    captcha_id = info.get('captcha_id')
+    idcode = info.get('idcode')
+    captcha = cache.get(captcha_id, '')
+    cache.delete(captcha_id)
+    if not login_info or not password:
+        raise ce.TipException(u"账户或密码不能为空!")
+    #if not idcode:
+    #    raise ce.TipException(u"验证码不能为空!")
+    #if idcode.upper() != captcha.upper():
+    #    raise ce.TipException(u"验证码错误!")
+
+    user = auth.authenticate(request, account=login_info, pwd=password)
+    if user:
+        auth.login(request, user)
+        return user
+    else:
+        raise ce.TipException(u"账号或密码错误!")
+
+
+def reset_password(request):
+    """
+    @attention: 重置密码
+    """
+    qdata = request.json
+    need_params = ["password","repassword","phone","phcode"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    uid = request.json.get("uid")
+    if not uid:
+        uid = request.user.id
+    phone = qdata.get("phone")
+    password = qdata.get("password")
+    repassword = qdata.get("repassword")
+    if password != repassword:
+        raise ce.TipException(u"两次输入的密码不一致!")
+    pwd = ph.make_password(password)
+    cm.UserInfo.objects.filter(phone=phone).update(password=pwd)
+
+
+def reset_user_password(request):
+    qdata = request.json
+    need_params = ["uid","code","password"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    upk = qdata.get("uid")
+    code = qdata.get("code")
+    pkey = get_user_info([upk])[0].get("phone")
+    pkey = request.user.phone
+    if cache.get(pkey,"") != code:
+        raise ce.TipException(u"验证码不正确!")
+    newpwd = qdata.get("password")
+    pwd = ph.make_password(newpwd)
+    cm.UserInfo.objects.filter(pk=upk).update(password=pwd)
+
+
+def regist_user(request):
+    """
+    """
+    kwargs = request.json
+    need_parms = ["realname","password","repassword","phone","email"]
+    mse = ccf.check_params(*need_parms,**kwargs)
+    if mse:
+        raise ce.TipException(mse)
+    if cm.UserInfo.objects.filter(phone=kwargs.get("phone")).exists():
+        raise ce.TipException(u"该手机号已注册!")
+    cvals = ccf.get_need_params(*need_parms,**kwargs)
+    cvals.pop("repassword")
+    cvals["name"] = cvals["phone"]
+    if kwargs["password"] != kwargs["repassword"]:
+        raise ce.TipException(u"前后输入的密码不一致!")
+    if not cvals.get("password"):
+        pwd,password = ph.make_default_password(None)
+        cvals.update({"password":password})
+    else:
+        pwd = cvals.get("password")
+        cvals.update({"password":ph.make_password(cvals.get("password"))})
+    uobj = cm.UserInfo.objects.create(**cvals)
+    return None

+ 126 - 0
src/enterprise/lock_account.py

@@ -0,0 +1,126 @@
+# coding:utf-8
+from django.core.cache import cache
+
+import common.error_info as cei
+
+MAX_ERROR_TIMES = 5
+MAX_ERROR_TIMES_IP = 20
+LOCK_IP_TMP = 'LOCK_IP_{}'
+LOCK_ACCOUNT_TMP = 'LOCK_ACCOUNT_{}'
+
+ACCOUNT_INCR_TMP = 'ACCOUNT_COUNT_{}'
+IP_INCR_TMP = 'IP_COUNT_{}'
+
+
+def is_lock(uid, ip):
+    """
+    是否锁
+    :param uid:
+    :param ip:
+    :return:
+    """
+    account_key = LOCK_ACCOUNT_TMP.format(uid)
+    ip_key = LOCK_IP_TMP.format(ip)
+
+    if cache.get(ip_key):
+        return "ip_lock"
+    if cache.get(account_key):
+        return "account_lock"
+    return False
+
+def is_lock_ip(ip):
+    """是否封禁IP
+    """
+    ip_key = LOCK_IP_TMP.format(ip)
+    if cache.get(ip_key):
+        return True
+    return False
+
+
+def increase_error_count(uid, ip):
+    """
+    5分钟内连续输错五次
+    :return:
+    """
+    ip_key = IP_INCR_TMP.format(ip)
+    ip_count = cache.get(ip_key) or 0
+
+    account_key = ACCOUNT_INCR_TMP.format(uid)
+    account_count = cache.get(account_key) or 0
+
+    if account_count + 1 >= MAX_ERROR_TIMES or ip_count + 1 >= MAX_ERROR_TIMES:
+        lock(uid, ip)
+        raise cei.TipException(u'密码连续输错五次,锁定ip和账户半个小时')
+    if not account_count:
+        cache.set(account_key, 1, 5*60)
+    else:
+        cache.incr(account_key)
+    if not ip_count:
+        cache.set(ip_count, 1, 5*60)
+    else:
+        cache.incr(ip_key)
+
+def increase_error_count_ip(ip):
+    """
+    """
+    ip_key = IP_INCR_TMP.format(ip)
+    ip_count = cache.get(ip_key) or 0
+    if ip_count + 1 >= MAX_ERROR_TIMES_IP:
+        lock(0,ip)
+        raise cei.TipException(u'密码连续输错20次,锁定ip半个小时!')
+    if not ip_count:
+        cache.set(ip_key, 1, 30*60)
+    else:
+        cache.incr(ip_key)
+
+def increase_error_count_uid(uid):
+    """
+    """
+    account_key = ACCOUNT_INCR_TMP.format(uid)
+    account_count = cache.get(account_key) or 0
+    if account_count + 1 >= MAX_ERROR_TIMES:
+        lock(uid,0)
+        raise cei.TipException(u'密码连续输错5次,锁定账户10分钟!')
+    if not account_count:
+        cache.set(account_key, 1, 10*60)
+    else:
+        cache.incr(account_key)
+
+
+
+def clear_lock_count(uid, ip):
+    """
+    清除计数,清楚锁ip,锁account的key
+    :param uid:
+    :param ip:
+    :return:
+    """
+    if uid:
+        cache.delete(ACCOUNT_INCR_TMP.format(uid))
+    if ip:
+        cache.delete(IP_INCR_TMP.format(ip))
+
+
+def lock(uid, ip):
+    """
+    锁账户,ip半个小时
+    :param uid:
+    :param ip:
+    :return:
+    """
+    clear_lock_count(uid, ip)
+    if uid:
+        key = LOCK_ACCOUNT_TMP.format(uid)
+        cache.set(key, 'lock_account', 10*60)
+    if ip:
+        key = LOCK_IP_TMP.format(ip)
+        cache.set(key, 'lock_ip', 30*60)
+
+def clear_lock(uid,ip):
+    clear_lock_count(uid, ip)
+    if uid:
+        key = LOCK_ACCOUNT_TMP.format(uid)
+        cache.delete(key)
+    if ip:
+        key = LOCK_IP_TMP.format(ip)
+        cache.delete(IP_INCR_TMP.format(ip))

+ 6 - 0
src/enterprise/models.py

@@ -0,0 +1,6 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models
+
+# Create your models here.

+ 41 - 0
src/enterprise/password_handle.py

@@ -0,0 +1,41 @@
+#coding=utf-8
+'''
+@attention: 密码加密验证模块
+'''
+import hashlib
+import re
+import common.error_info as ceil
+import random
+
+def check_password(new,old):
+    """
+    @attention: 验证密码
+    """
+    np = hashlib.md5(new).hexdigest().upper()
+    return np==old
+
+def make_password(pwd):
+    """
+    @attention: 密码加密
+    """
+    if not re.search(r'^.*(?=.{8,15})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[!@#$%^&*?\(\)]).*$',pwd):
+        raise ceil.TipException(u"密码不符合符号要求!")
+    return hashlib.md5(pwd).hexdigest().upper()
+
+def make_default_password(pwd):
+    """
+    @attention: 密码加密
+    """
+    ustr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    lstr = "abcdefghjklmnopqrstuvwxyz"
+    dstr = "0123456789"
+    sstr = "!@#$%&*"
+    pwd = "".join(random.sample(ustr,3)+random.sample(lstr,3)+random.sample(dstr,3)+random.sample(sstr,3))
+    return pwd,hashlib.md5(pwd).hexdigest().upper()
+
+if __name__ == '__main__':
+    old = "123456"
+    op = make_password(old)
+    # print op
+    new = "123456"
+    # print check_password(new, op)

+ 14 - 0
src/enterprise/urls_backstage.py

@@ -0,0 +1,14 @@
+# coding=utf-8
+'''
+'''
+from django.conf.urls import url
+from enterprise import views
+
+urlpatterns = [
+    # 运营
+    url(r'^info$', views.EnterpriseView.as_view()),
+    url(r'^list$', views.EnterpriseListView.as_view()),
+    url(r'^trans/info$', views.EnterpriseTransView.as_view()),
+    url(r'^trans/list$', views.EnterpriseTransListView.as_view()),
+]
+

+ 208 - 0
src/enterprise/views.py

@@ -0,0 +1,208 @@
+# coding=utf-8
+from __future__ import unicode_literals
+import random
+import json
+import uuid
+from django.contrib import auth
+from django.core.cache import cache
+from django.conf import settings
+
+from common import core_views as cv
+from common.captcha import create_idcode
+from common.models import UserInfo
+import control_enterprise as ce
+import control_transaction as ct
+from utils.cloopen_sms import cloopensms
+
+class EnterpriseView(cv.AuthView):
+    def post(self,request):
+        """#新增客户(企业)
+        @name:"成都归藏元",企业名称
+        @regno:"112121",注册号
+        @licenceorg:"成都工商局",发证机关
+        @enttype:"企业服务",企业类型
+        @address:"办公地址"
+        @legalperson:"肖",法人
+        @entcontact:"15982456282"
+        @industry:"机械"
+        @taxtype:"小规模纳税人"
+        @subindustry:"机械加工"
+        @profit:100,年利润
+        @turnover:200,年营业额
+        @entscale:"100~200",企业规模
+        @regdate:"2020.10.01",注册日期
+        @busscope:"主要经营机械加工...",主要经营范围
+        @principals:[{
+            "name":"肖小肖",
+            "job":"开发",
+            "sex":"男",
+            "phone":"15982456282",
+            "procert":"软件工程师",
+            "college":"成都理工",
+            "birthday":"1990.02.02",
+            "hoby":"钓鱼,爬山"
+            }]
+        @finacial:"专职财务"
+        @funding:"天使轮"
+        @legalstate:"专职法务"
+        """
+        try:
+            rst = ce.add_enterprise(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc()
+
+    def put(self,request):
+        """#修改客户(企业)
+        @id:1,客户id
+        @name:"成都归藏元",企业名称
+        @regno:"112121",注册号
+        @licenceorg:"成都工商局",发证机关
+        @enttype:"企业服务",企业类型
+        @address:"办公地址"
+        @legalperson:"肖",法人
+        @entcontact:"15982456282"
+        @industry:"机械"
+        @taxtype:"小规模纳税人"
+        @subindustry:"机械加工"
+        @profit:100,年利润
+        @turnover:200,年营业额
+        @entscale:"100~200",企业规模
+        @regdate:"2020.10.01",注册日期
+        @busscope:"主要经营机械加工...",主要经营范围
+        @principals:[{
+            "name":"肖小肖",
+            "job":"开发",
+            "sex":"男",
+            "phone":"15982456282",
+            "procert":"软件工程师",
+            "college":"成都理工",
+            "birthday":"1990.02.02",
+            "hoby":"钓鱼,爬山"
+            }]
+        @finacial:"专职财务"
+        @funding:"天使轮"
+        @legalstate:"专职法务"
+        """
+        try:
+            rst = ce.update_enterprise(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc()
+
+
+    def delete(self,request):
+        """#删除客户(企业)
+        @id:1,客户id(多个用逗号分隔)
+        """
+        try:
+            rst = ce.delete_enterprise(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc()
+
+
+    def get(self,request):
+        """#获取客户详情
+        @id:1,"客户id"
+        """
+        try:
+            rst = ce.get_enterprise_info(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc(rst)
+
+
+class EnterpriseListView(cv.AuthView):
+    def get(self,request):
+        """#获取客户列表
+        @name:"成都归藏元",客户名称
+        @industry:"机械",行业
+        @istrans:1/0,是否有交易
+        @transpro:"代理记账",成交产品
+        @licenceorg:"成都高新",发证机关
+        @enttype:"个体户",企业类型
+        @turnover:1/0,年营业额大于2000
+        """
+        try:
+            total,rst = ce.get_enterprise_list(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc({"total":total,"list":rst})
+
+
+class EnterpriseTransView(cv.AuthView):
+    def post(self,request):
+        """#新增交易
+        @enterprise_id:1,客户(企业)id
+        @product_id:1,客户(企业)id
+        @price:1800,价格
+        @service_period:"2020-01-01,2020-08-01",服务周期
+        """
+        try:
+            rst = ct.add_transaction(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc()
+
+    def put(self,request):
+        """#修改交易
+        @id:1,交易id
+        @enterprise_id:1,客户(企业)id
+        @product_id:1,客户(企业)id
+        @price:1800,价格
+        @service_period:"2020-01-01,2020-08-01",服务周期
+        """
+        try:
+            rst = ct.update_transaction(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc()
+
+
+    def delete(self,request):
+        """#删除交易
+        @id:1,交易id
+        """
+        try:
+            rst = ct.delete_transaction(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc()
+
+
+    def get(self,request):
+        """#获取客户详情
+        @id:1,"客户id"
+        """
+        try:
+            rst = ct.get_transaction_info(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc(rst)
+
+
+class EnterpriseTransListView(cv.AuthView):
+    def get(self,request):
+        """#获取客户交易记录
+        @enterprise_id:1,客户id
+        @enterprise_name:"成都归藏元",客户名称
+        @product_id:1,产品
+        """
+        try:
+            total,rst = ct.get_transaction_list(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc({"total":total,"list":rst})
+
+

+ 350 - 0
src/enterprise/views_backstage.py

@@ -0,0 +1,350 @@
+#-*-coding:utf-8-*-
+import json
+import uuid
+from django.contrib import auth
+from django.core.cache import cache
+from django.conf import settings
+
+from common import core_views as cv
+from common.models import UserInfo
+import common.common_functions as ccf
+import common.error_info as ce
+import control_user as cu
+import control_role as crol
+import control_organization as co
+import common.common_control as ccc
+import control_permission as cp
+
+
+class InfoView(cv.AuthView):
+    def get(self, request):
+        '''
+        #获取全局账号信息
+        '''
+        user = request.user
+        uid = user.id
+        pcode = []
+        try:
+            users = cu.get_user_info([uid],None,["pcode"])[0]
+            return cv.to_suc(users)
+        except Exception as e:
+            return cv.to_fail(e)
+
+class UserView(cv.BaseView):
+    def get(self, request):
+        """
+        #获取用户详情
+        @id:1,用户id
+        """
+        qdata = request.json
+        try:
+            need_params = ["id"]
+            mse = ccf.check_params(*need_params,**qdata)
+            if mse:
+                raise ce.TipException(mse)
+            id = qdata.get("id")
+            res = cu.get_user_info([id],None,relations=["contctsinfo","authinfo","roleinfo"])
+            res = res[0] if res else []
+            return cv.to_suc(res)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc()
+
+    def post(self, request):
+        '''
+        #新增用户
+        @name:"test",用户名
+        @password:"test123456",用户密码
+        @expiry_date:"20191203",过期时间
+        @organization_id:"1",组织机构id角色为门户平台用户传
+        @role_id:7,角色id
+        @unitname:"单位名称",运营中心名称
+        @contactinfo:[{"name":"","email":""}],联系人信息
+        @authinfo":{"max_domain_num":10,"authorized":"available,bug,event","label":"试用"}
+        @realname:"姓名"
+        @phone:"129823"
+        @email:"129823@qq.com"
+        '''
+        qdata = request.json
+        try:
+            qdata["pid"] = request.user.id
+            user = cu.add_user(**qdata)
+            return cv.to_suc(user)
+        except Exception as e:
+            import traceback
+            traceback.print_exc()
+            return cv.to_fail(e)
+
+    def put(self, request):
+        """
+        #修改用户信息
+        @id:1,用户id其他参数同新增
+        """
+        qdata = request.json
+        try:
+            data = cu.update_user(**qdata)
+        except Exception as e:
+            return cv.to_fail(e)
+        return cv.to_suc(data)
+
+    def delete(self, request):
+        """
+        #删除用户信息
+        @id:1,多个id用逗号分隔
+        """
+        qdata = request.json
+        try:
+            cu.delete_user(**qdata)
+        except Exception as e:
+            return cv.to_fail(e)
+        return cv.to_suc()
+
+class InfoListView(cv.AuthView):
+    def get(self, request):
+        """
+        #用户列表
+        @name:"用户名"
+        @page:1
+        @page_size:10
+        """
+        user = request.user
+        uid = user.id
+        qdata = request.json
+        page = int(qdata.get("page",0))
+        page_size = int(qdata.get("page_size",0))
+        try:
+            total,res = ccc.get_sub_users(uid,page,page_size,qdata)
+            return cv.to_suc({"total":total,"list":res})
+        except Exception as e:
+            return cv.to_fail(e)
+
+
+class RoleListView(cv.AuthView):
+    def get(self, request):
+        """#角色列表
+        @page:1 页面
+        @page_size:10 每页数量,默认10
+        """
+        qdata = request.json
+        print qdata
+        page = qdata.get("page",0)
+        page_size = qdata.get("page_size",10)
+        if page:
+            total,roles = crol.get_role_list(None,page=page,page_size=page_size)
+
+            return cv.to_suc({"total":total,"list":roles})
+        else:
+            roles = crol.get_all_role_list()
+            return cv.to_suc(roles)
+
+
+class RoleInfoView(cv.AuthView):
+    """
+    """
+    def get(self,request):
+        """
+        #角色详情
+        @id:1,角色id
+        """
+        qdata = request.json
+        need_params = ["id"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        id = qdata.get("id")
+        try:
+            role = crol.get_role_info(*[id])
+            role = role[0] if role else {}
+            return cv.to_suc(role)
+        except Exception as e:
+            return cv.to_fail(e)
+
+
+    def post(self,request):
+        """#角色添加
+        @name:"test" 角色名称
+        @desc:"test" 角色描述
+        @permission_addroles:[1,2,3] 可以添加的用户角色
+        @permssions:[1,2,3] 权限ID
+        @platform:"operation" 角色归属
+        """
+        qdata = request.json
+        uname = request.user.name
+        qdata.update({"cperson":uname})
+        try:
+            crol.add_role(**qdata)
+            return cv.to_suc()
+        except Exception as e:
+            return cv.to_fail(e)
+
+
+    def put(self,request):
+        """#角色修改
+        @id:3 角色id
+        @name:"test" 角色名称
+        @desc:"test" 角色描述
+        @permission_addroles:[1,2,3] 可以添加的用户角色
+        @permssions:[1,2,3] 权限ID
+        @platform:"operation" 角色归属
+        """
+        qdata = request.json
+        try:
+            crol.update_role(**qdata)
+            return cv.to_suc()
+        except Exception as e:
+            return cv.to_fail(e)
+
+    def delete(self,request):
+        """
+        #角色删除
+        @id:1,2 角色id批量删除多个id用逗号分隔
+        """
+        qdata = request.json
+        try:
+            crol.delete_role(**qdata)
+            return cv.to_suc()
+        except Exception as e:
+            return cv.to_fail(e)
+
+
+class PermissionListView(cv.AuthView):
+    def get(self, request):
+        """#权限列表
+        @role_id:1 角色id 可选参数 传了就只返回对应角色的权限
+        @platform:"operation" 权限归属 可选参数 传了就对权限进行平台过滤
+        """
+        qdata = request.json
+        role_id = qdata.get("role_id",None)
+        platform = qdata.get("platform",None)
+        roles = cp.get_permission_list(role_id,platform)
+
+        return cv.to_suc(roles)
+
+
+class OrganizationTreeView(cv.AuthView):
+    def get(self, request):
+        """#获取组织机构树
+        """
+        try:
+            uid = request.user.id
+            otree = co.get_organization_tree(uid)
+            return cv.to_suc(otree)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class OrganizationSearchView(cv.AuthView):
+    def get(self, request):
+        """#搜索组织机构
+        @name:u"测试单位1"
+        """
+        try:
+            uid = request.user.id
+            print request.json
+            name = request.json.get("name","")
+            otree = co.search_organization(name)
+            return cv.to_suc(otree)
+        except Exception as e:
+            return cv.to_fail(e)
+
+
+class OrganizationInfoView(cv.AuthView):
+    def get(self, request):
+        """#获取组织机详情
+        @id:1,组织机构id
+        """
+        qdata = request.json
+        need_params = ["id"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        id = qdata.get("id")
+        try:
+            oinfo = co.get_organization_info(*[id])[0]
+            return cv.to_suc(oinfo)
+        except Exception as e:
+            return cv.to_fail(e)
+
+
+    def post(self, request):
+        """#添加组织机构
+        @name:"",组织机构名称
+        @sname:"",组织机构简称称
+        @desc:"",简介 非必传
+        @pid:"",上级组织机构id 非必传
+        """
+        qdata = request.json
+        user = request.user
+        qdata.update({"cperson":user.name,"cid":user.id})
+        try:
+            co.add_organization(**qdata)
+            return cv.to_suc()
+        except Exception as e:
+            return cv.to_fail(e)
+
+
+    def put(self, request):
+        """#修改组织机构
+        @id:"",组织机构id
+        """
+        qdata = request.json
+        try:
+            co.update_organization(**qdata)
+            return cv.to_suc()
+        except Exception as e:
+            return cv.to_fail(e)
+
+
+    def delete(self, request):
+        """#删除组织机构
+        @id:1,2 组织机构id批量删除多个id用逗号分隔
+        """
+        qdata = request.json
+        try:
+            co.delete_organization(**qdata)
+            return cv.to_suc()
+        except Exception as e:
+            return cv.to_fail(e)
+
+
+class ResetPwdView(cv.BaseView):
+    def put(self, request):
+        """
+        #重置密码(忘记密码)
+        @phone:"15982456282",手机号
+        @password:"",新密码
+        @repassword:"",确认密码
+        @phcode:"123",验证码
+        """
+        try:
+            cu.reset_password(request)
+            return cv.to_suc()
+        except Exception as e:
+            return cv.to_fail(e)
+
+
+class ResetUserPwdView(cv.AuthView):
+    def put(self, request):
+        """
+        #修改用户密码
+        @uid:10,用户id不传则默认当前用户
+        @code:"",验证码
+        @password:"",新密码
+        """
+        try:
+            cu.reset_user_password(request)
+            return cv.to_suc()
+        except Exception as e:
+            return cv.to_fail(e)
+
+
+class DepartmentView(cv.AuthView):
+    def post(self,request):
+        """
+        #新增部门
+        @name:"综管部",部门名称
+        @pid:1,上级部门
+        @permissions:["CusManage.*.*","CusManage.MyCus.*"]
+        """

+ 4 - 0
src/enterprise/views_permission.py

@@ -0,0 +1,4 @@
+#-*-coding:utf-8 -*-
+import common.core_views as cv
+
+

+ 1 - 0
src/urls.py

@@ -31,6 +31,7 @@ urlpatterns = [
     url(r'^api/hook/$', wview.HookView.as_view()),
     url(r'^api/dashboard/', include('dashboard.urls_backstage')),
     url(r'^api/oplog/', include('operation_log.urls_backstage')),
+    url(r'^api/entcus/', include('enterprise.urls_backstage')),
 ]
 
 urlpatterns += [