# knowledge **一、运行截图** **二、应收分析** 应收,顾名思义,即为应该收入的销售单,应收主要与发票、收款、核销业务高度集成。 目前展示的功能为应收单列表,快捷查询应收单;提供申请开票、开票、申请合并开票、合并开票、导出功能。 #### 算法 可开票金额=价税合计-已开票金额-退货金额 注:退货金额来源于应收单详情的价税合计*退货数量 #### 关键业务流程 1)我的应收 基于业务条件,并通过登录用户的工号(empno)到订单表进行查询 1. 共享应收 基于业务条件,并通过登录用户的工号(empno)到服务团队人员表(t_crm_serviceman) 通过客户编码(clientcode)跟订单表的客户编码关联查询出t_crm_serviceman 中bill_share_order不等于null (rolecode=负责人时为null)或者shareorder_no(不为不共享=共享->可能为读或者写)或者rolecode=负责人相关订单数据 1. 我负责的部门应收 基于业务条件,并通过登录用户的userid查询部门责任信息表(t_crm_deptduty),如果系统设置--部门设置模块中 部门负责人、部门助理、技术支持等配置了则取部门负责人表的信息查询相关应收单数据 1. 全公司的应收 基于业务条件直接查询应收单表 4)合并开票会验证客户是否被禁用,禁用得客户无法开票 **三、发票分析** 开票业务在应收和订单中集成,销售通过立即开票或者在应收列表点击申请开票,然后助理审核对接到ERP生成发票数据;通过ERP同步到CRM更新发票里面的状态。 **关键业务流程** #### 算法 1. 发票状态判断 2. 退货金额+开票金额=0、价税合计大于0:等待开票 3. 价税合计 = 退货金额或者实际价税合家为0 :关闭; 4. 退货金额+开票金额>=订单价税合计:全开票; 5. 否则:部分开票 6. 当ERP系统里面发票结案状态为"强结案",同步到CRM系统时需要将强结案的发票红冲状态修改为"作废",将目前系统里面发票核销状态显示"已核销"逻辑去除并按原始核销状态的取值逻辑取值; **四、收款与核销分析** 收款业务主要有收款单核销与收款单确认主要用于关联发票与收款单进行核销操作。 #### 算法 涉及算法的位置:点击核销,打开核销详情页面,匹配发票数,筛选相同开票单位且和当前选中的发票未核销金额相等的发票(最多支持同时匹配3条)。 注:x=当前发票未核销金额;a=匹配发票未核销金额;b=匹配发票未核销金额;c=匹配发票未核销金额;size=数组长度;i=数组当前下标;minSize=数组最小下标;maxSize=数组最大下标;arr=数组 1. 匹配数1条 a=x 1. 匹配数2条 a+b=x 1. 匹配数3条 a+b+c=x 该算法的关键在于去除重复匹配的数据,减少循环层数,提高查询效率。 算法核心:固定i,同时前后移动数组进行比较(这里只说明三条匹配的算法,两条是一样的原理) 1. 当minSize=0且maxSize=0时,minSize=i+1;maxSize=size+1(同时从数组前后进行比比较) 2. 当minSize>=size时,i+1且跳出循环(此时说明当次比较已经完成,跳出循环进行下次比较) 3. 当minSize>=maxSize时,使maxSize=0,maxSize=0,i+1且跳出循环(此时也说明当次比较完成,跳出循环,将下标进行初始化,当前下标+1进行下一次比较) 4. 当a+b+c=x时,使maxSize=0,maxSize=0,i+1且跳出循环,并将arr[i],arr[minSize],arr[maxSize]放入结果中(此时说明满足条件,将结果放入满足条件的集合中,跳出循环进行下一次比较) 5. 当a+b+c>x时,minSize,i保持不变,maxSize-1,继续进行比较 6. 当a+b+c