# 模型邏輯層之實戰代碼
這節 其實沒有什么好說的 當你把每個復雜的邏輯處理過程封裝到邏輯層中,你前段的控制器代碼就會優雅簡潔很多
>[warning] 不要糾結你給你的邏輯處理代碼起的名稱 和存放位置
* 代碼一
~~~
/**
* 創建項目預算書
* User: Mikkle
* Q Q:776329498
* @param $data
* @param $id
* @param $project_id
* @return array
*/
public function buildBudgetBook($data,$id,$project_id){
try{
$this->startTrans();
//修改審核記錄
if(!$this->data($data)->isUpdate(true,['guid'=>$id])->save()){
throw new Exception("審核信息失敗");
}
if($project_id!=$this->where(['guid'=>$id])->value("project_id")){
throw new Exception("項目ID獲取出錯!");
}
//審核結果 1審核通過
$m=isset($data['examine_status']) ? $data['examine_status'] : 0 ;
if($m==1){
$model_book_number= new BudgetBookNumber();
Db::table("mk_budget_default_book_number")->where(["project_id"=>$project_id,"status"=>1])->update(["status"=>2]);
$model_book_number->save(["project_id"=>$project_id]);
$book_number_id = $model_book_number->id;
if(!is_numeric($book_number_id)){
throw new Exception("獲取預算書ID失敗");
}
//預算書編號
$book_number = $book_number_id+100000;
$model_book_number->save(["book_number"=>$book_number],["id"=>$book_number_id]);
$list_default_book = Db::table("mk_budget_default_book")->where(["project_id"=>$project_id,"status"=>1])->select();
if(count($list_default_book)!=1){
throw new Exception("項目書數量不是唯一");
}
$list_default_book=$list_default_book[0];
unset($list_default_book["id"]);
$list_default_book["book_number"]=$book_number;
if(!isset(DefaultBookCopy::create($list_default_book)["id"])){
throw new Exception("出錯了");
}
//插入裝修項目信息
$list_default_project = Db::table("mk_budget_default_project")->where(["project_id"=>$project_id,"status"=>1])->select();
$append=["book_number"=>$book_number];
$unset=["id"];
//重整數組 追加 book_number 刪除 id
$list_default_project=$this->changeArrayColumnData($list_default_project,$append,$unset);
$insert_count= count($list_default_project);
$model_project =new DefaultProjectCopy();
//超過100條 分批插入
if ($insert_count>0 && $insert_count<100){
$model_project->insertAll($list_default_project);
}elseif($insert_count>100){
$insert_batch= ceil($insert_count/100);
for( $i=0 ;$i<$insert_batch;$i++ ){
$model_project->insertAll(array_slice($list_default_project, $i*100,100));
}
}
//插入裝修費率信息
$list_default_rate = Db::table("mk_budget_default_rate")->where(["project_id"=>$project_id,"status"=>1])->select();
$append=["book_number"=>$book_number];
$unset=["id"];
//重整數組 追加 book_number 刪除 id
$list_default_rate=$this->changeArrayColumnData($list_default_rate,$append,$unset);
$model_rate =new DefaultRateCopy();
$model_rate->insertAll($list_default_rate) ;
}
$this->commit();
return self::showReturnCodeWithOutData(1001);
}catch (Exception $e){
$this->rollback();
return self::showReturnCodeWithOutData(1008,$e->getMessage());
}
}
~~~
* 實戰代碼二
以前寫的代碼 其實他更像是控制器的邏輯層
我現在也看著頭大
~~~
/**
* 訂單排產
* User: Mikkle
* Q Q:776329498
* @param string $batch_no
*/
public function createFactoryProductBomByBatchNo($batch_no='20170303-16575510'){
@ob_end_clean();
@ob_implicit_flush(0);
try{
if (!$batch_no){
throw new \Exception("生產批號[{$batch_no}]數據不存在");
}
$model = new FactoryBatch();
$batch_info=$model -> where(['batch_no'=>$batch_no])->find();
if($batch_info['batch_status']!= 1){
throw new \Exception("生產批號[{$batch_no}]排產狀態異常,請確認是否已經安排排產");
}
$this->flush_str("生產批號[{$batch_no}]排產狀態驗證通過!");
$this->batch_no=$batch_no;
$order_list = $model -> table('my_factory_orders_batch_access') -> where(['batch_no'=>$batch_no,'factory_state'=>0,'status'=>1]) -> column('order_no');
if($batch_info['order_num']!== count($order_list)){
throw new \Exception("生產批號[{$batch_no}]訂單數量和流水線數量不符 請聯系系統管理員Mikkle");
}
$this->flush_str("生產批號[{$batch_no}]訂單數量和流水線數量驗證相符!");
$this->flush_str("生產批號[{$batch_no}]共有訂單{$batch_info['order_num']}份");
$model->startTrans();
$this->flush_str("生產批號[{$batch_no}]驗證通過,進入BOM單分解流程開始!");
$count_package=[];
$count_product=[];
foreach ($order_list as $item=>$order) {
$no = $item +1;
$order_info = $model ->table('my_orders')->where(['order_no' => $order,'status' => 1,'is_pay' => 1,'factory_batch'=>$batch_no,'factory_state'=>1])->find();
if (!$order_info) {
throw new \Exception("訂單[{$order}]狀態異常或不存在,請核對訂單號再排產");
}
$this->flush_str("<-------------------拆解訂單第{$no}個[{$order}]數據開始------------------->");
$this->flush_str("已經驗證訂單[{$order}]狀態正常");
$save_data=$this->splitOrder($order);
if (!$save_data) {
throw new \Exception("訂單[{$order}]BOM單分解數據不存在,請聯系管理員.");
}
$count_package = $this->guidCountAdd($count_package,$this->count_package);
$count_product = $this->guidCountAdd($count_product,$this->count_product);
$data_num = count($save_data);
$this->flush_str("拆解訂單第{$no}個[{$order}]數據,共計[$data_num]份BOM數據");
foreach($save_data as $key=>$value){
$num=$key+1;
$this->flush_str("拆解訂單[{$order}]數據第[$num]份BOM數據,{$value['product_bom_name']}");
}
if($model->table('my_factory_orders_bom_access')->insertAll($save_data)==0){
throw new \Exception("寫入訂單[{$order}]Bom單信息數據失敗!");
};
$this->flush_str("寫入訂單[{$order}]Bom單信息數據成功!");
$this->flush_str("<-------------------拆解訂單第{$no}個[{$order}]數據結束------------------->");
}
$save_count_data=array_merge($this->buildCountDataArray($count_package,'Package'), $this->buildCountDataArray($count_product,'Product'));
if($model->table('my_factory_batch_plan')->insertAll($save_count_data)==0){
throw new \Exception("寫入生產批次[{$batch_no}]商品統計數據失敗!");
};
$this->flush_str("寫入生產批次[{$batch_no}]商品統計數據成功!");
$this->flush_str("生產批號[{$batch_no}]全部BOM單分解成功!");
//更新訂單表信息
if (!$model->table('my_orders')->where(['factory_batch' => $batch_no])->update([ 'factory_state' => 2])) {
throw new \Exception("更新[$batch_no]訂單表數據失敗");
}
$this->flush_str("更新[$batch_no]訂單表數據成功.");
//更新訂單表信息
if($batch_info->where('batch_no',$batch_no)->update(['batch_status'=>2])==0){
throw new \Exception("生產批號[{$batch_no}]排產狀態修改失敗!");
};
$this->flush_str("生產批號[{$batch_no}]狀態修改成功!");
$model->commit();
$this->flush_str("生產批號[{$batch_no}]BOM單分解成功!");
$this->flush_str("<a onclick='history.go(-1)'>返回上一頁</a>");
} catch (\Exception $e) {
// / dump($e);
$model->rollback();
$this->batch_no = Null;
$str = "出錯了,[{$e->getMessage()}],系統關聯操作被取消!";
$this->flush_str($str);
}
}
public function batchNoFactoryProductBomRollback($batch_no){
@ob_end_clean();
@ob_implicit_flush(0);
$model_order = new Orders();
try {
if (!$batch_no) {
throw new \Exception('要回滾的生產批號不存在');
}
$batch_info=$model_order->table('my_factory_batch')->where(['batch_no'=>$batch_no,'status'=>1])->find();
if (!$batch_info) {
throw new \Exception("要回滾的生產批號[{$batch_no}]數據不存在");
}
if ($batch_info['batch_status']!=2) {
throw new \Exception("該生產批號[{$batch_no}]狀態已經改變,不允許回滾.");
}
$order_num=$model_order->where(['is_pay' => 1, 'status' => 1, 'factory_batch' => $batch_no])->count('id');
if ($batch_info['order_num']!=$order_num) {
throw new \Exception("該生產批號[{$batch_no}]要回滾的數量異常,請聯系Mikkle.");
}
$this->flush_str("生產批號{$batch_no}回滾的訂單號數量[{$order_num}]條,驗證正確!!");
$model_order->startTrans();
$this->flush_str("生產批號{$batch_no}回滾驗證已經通過,開始執行生成批號撤銷!");
//更新訂單表信息
if (!$model_order->update([ 'factory_state' => 1], ['factory_batch' => $batch_no,'is_pay' => 1, 'status' => 1,])) {
throw new \Exception("回滾生成批次[$batch_no]數據失敗");
}
$this->flush_str("生產批號{$batch_no}相關訂單數據回滾成功!");
//回滾生產BOM表
if (!$model_order->table('my_factory_orders_bom_access')->where(['batch_no'=>$batch_no,'status' => 1])->update(['status'=>0,'factory_desc'=>'該生產批號已經撤銷'])) {
throw new \Exception("回滾生產批次[$batch_no]BOM數據失敗");
}
$this->flush_str("回滾生產批次[$batch_no]流水數據成功!");
//回滾生產統計數據
if (!$model_order->table('my_factory_batch_plan')->where(['batch_no'=>$batch_no,'status' => 1])->update(['status'=>0,'factory_desc'=>'該生產批號已經撤銷'])) {
throw new \Exception("回滾生產批次[$batch_no]統計數據失敗");
}
$this->flush_str("回滾生產批次[$batch_no]統計數據成功!");
//回滾生產批號狀態
if (!$model_order->table('my_factory_batch')->where(['batch_no'=>$batch_no])->update(['batch_status'=>1,])) {
throw new \Exception("回滾生產批號[{$batch_no}]數據失敗");
}
$this->flush_str("回滾生產表批號[{$batch_no}]數據成功");
$model_order->commit();
$this->flush_str("回滾操作成功");
} catch (\Exception $e) {
$model_order->rollback();
$str = "出錯了,[{$e->getMessage()}],系統關聯操作被取消!";
$this->flush_str($str);
}
}
~~~
- 序言及更新日志
- 前言一 開發PHP必備的環境(你可以不看)
- LinUX系統ThinkPHP5鏈接MsSQL數據庫的pdo_dblib擴展
- centos7.2掛載硬盤攻略
- Centos系統Redis安裝及Redis的PHP擴展安裝
- Centos系統增加Swap(系統交換區)的方法
- 前言二 開發PHP軟件配置和介紹(你依然可以不看)
- 數據庫SQL文件
- 本地Git(版本控制)的搭建
- GIT遠程倉庫的克隆和推送
- Git常用命令
- PHP面向對象思想實戰經驗領悟
- PHP面向對象實戰----命名空間
- PHP面向對象實戰----繼承
- 基類實戰--底層方法封裝
- 基類實戰--構造函數實戰
- 基類實戰--析構函數的使用
- TP5實戰開發前篇---控制器(controller)
- 控制器中Request類的使用
- 控制器中基類的使用
- TP5實戰開發前篇---模型篇(model)
- TP5實戰開發前篇---驗證器篇(Validate)
- TP5實戰課程入門篇---花拳繡腿
- 模塊以及類的文件的建立
- Api開發------單條信息顯示
- Api開發---單條信息復雜關聯顯示
- Api開發---查詢信息緩存Cache的應用
- TP5實戰技巧---開發思路 引路造橋
- TP5實戰技巧---整合基類 化繁為簡
- TP5實戰課程入門篇---數據操作
- Api開發---數據的添加和修改
- API開發---快速開發API通用接口
- TP5專用微信sdk使用教程
- THINKPHP5微信SDK更新記錄及升級指導
- TP5專用SDK 微信參數配置方法
- 微信公眾號推送接口對接教程
- 微信推送接口對接示例含掃描登錄微信端部分
- TP5專用微信支付SDK使用簡介
- TP5專用支付寶支付SDK使用說明
- 使用NW將開發的網站打包成桌面應用
- TP5高階實戰課程 進階篇概述
- 進階篇一 實戰開發之習慣及要求
- 進階篇二 實戰開發之控制器
- 控制器基類之控制器基類使用方法
- 控制器基類之控制器基類常用方法分享
- 控制器基類之構造函數的使用方法
- 進階篇三 實戰開發之權限控制
- TP5實戰源碼 --- 全局用戶信息驗證類Auth
- TP5實戰源碼 --- 微信Auth實戰開發源碼
- 進階篇四 實戰開發之模型
- 模型基類之模型基類的用途
- 模型基類之常用數據處理方法
- 模型邏輯層之實戰代碼(含事務)
- 模型實戰開發之模型常用方法
- 模型實戰源碼 --- 樂觀鎖的應用
- 模型實戰技巧---Model事件功能的使用
- 模型事件實戰應用---數據庫操作日志
- 進階篇五 實戰開發之緩存(Cache)
- TP5實戰源碼---應用緩存獲取城市信息
- TP5實戰源碼---應用緩存獲取分類詳情
- 進階篇六 TP5類庫的封裝和使用
- DataEdit快捷操作類庫
- ShowCode快捷使用類庫
- 阿里大于 短信API接口 TP5專用類庫
- DatabaseUpgrade數據庫對比及更新類庫
- AuthWeb權限類使用說明
- 進階篇七 服務層的應用
- 服務層源碼示例
- 服務層基類源碼
- 進階篇八 應用層Redis數據處理基類
- Redis服務層基類源碼
- 進階篇九 使用Redis類庫處理一般的搶購(秒殺)活動示例
- 進階篇十 某大型項目應用本Redis類源碼示例(含事務 樂觀鎖)
- 進階篇十一 邏輯層的應用
- 邏輯層基類源碼
- 進階篇 服務層代碼示例
- 高階實戰課程 進階篇持續新增中
- 高階篇一 TP5命令行之守護任務源碼
- TP5實戰源碼 --- 命令行
- TP5實戰源碼 --- 通過shell建立PHP守護程序
- 高階篇二 使用Redis隊列發送微信模版消息
- 高階篇二 之 Worker隊列基類源碼
- 高階篇三 TP5實戰之Redis緩存應用
- Redis實戰源碼之Hash專用類庫源碼
- Redis實戰源碼之Model類結合
- Redis實戰源碼之模型Hash基類源碼
- Redis實戰源碼之Hash查詢使用技巧
- Redis實戰源碼之 shell腳本中redis賦值和取值
- 高階篇四 Swoole的實戰應用
- swoole基類代碼
- Swoole擴展WebsocketServer專用類
- 基于Swoole的多Room聊天室的程序
- Swoole守護服務shell源碼
- 高階篇五 命令行異步多進程隊列類的應用
- tp_worker類源碼
- WorkerBase
- WorkerCommand
- WorkerRedis
- Redis類
- CycleWorkBase
- WorkerHookBase異步鉤子
- 隊列日志SQL
- 高階篇六 定時執行隊列類庫以及使用方法
- 定時隊列類庫源碼
- 高階篇七 異步執行循環隊列類庫以及使用教程
- CycleWorkBase源碼
- 高階實戰課程 進階篇持續新增中
- Extend便捷類庫源碼庫
- 阿里相關類庫
- SendSms--驗證碼API接口文件
- 權限相關類庫目錄
- AuthWeb 權限驗證類庫
- Redis便捷操作類庫(20171224更新)
- Redis
- Tools工具類庫集
- Curl類庫
- DataEdit
- Rand類庫
- ShowCode類庫
- Upload類庫
- 附件集合
- 附件一:微信支付 實戰開發源碼
- 微信支付類庫源代碼
- Common_util_pub.php
- DownloadBill_pub.php
- JsApi_pub.php
- NativeCall_pub.php
- NativeLink_pub.php
- OrderQuery_pub.php
- Refund_pub.php
- RefundQuery_pub.php
- SDKRuntimeException.php
- ShortUrl_pub.php
- UnifiedOrder_pub.php
- Wxpay_client_pub.php
- Wxpay_server_pub.php
- WxPayConf_pub.php
- 微信支付回調頁面源碼
- 附件二 順豐快遞BSP接口實戰開發源碼
- 順豐快遞BSP接口實戰開發源碼
- 順豐BSP基類
- 順豐BSP基礎代碼
- 順豐BSP下單接口
- 順豐BSP查單接口
- 順豐BSP確認/取消接口
- 附件三 APP注冊登陸接口源碼(含融云平臺接口)
- 附件四 TP5訂單Model(含事務 獲取器 修改器等方法)
- 附錄五 RSA加密解密
- Rsa文件源碼
- 附件六 阿里大于短信接口
- 附件七 AES加解密類
- AES加解密類源碼
- 附件八 TP5路由設置源碼
- 附件九 TP5 Excel導入導出下載便捷類庫
- Excel類庫TP5源碼
- 附件十 TP5便捷操作Redis類庫源碼
- TP5源碼 Redis操作便捷類庫
- 附件十一 TP5源碼 上傳文件入庫類源碼
- 上傳類Upload源碼
- Upload類上傳配置文件
- 存儲圖像文件的數據庫SQL文件
- 存儲文件的數據庫SQL文件
- 附件十二 TP5 圖片處理增強類 支持縮略圖在線顯示
- 附件十三 微信推送消息接口類庫源碼
- 附件十三 微信推送消息接口類庫源碼 之 基類
- 附件十四 存儲微信昵稱的處理方法